【小木箱生长营】暗码学系列教程:
Web3.0 根底层技能 暗码学在移动端运用与实践
一、序言
Hello,我是小木箱,欢迎来到小木箱生长营暗码学系列教程,今日将同享Web3.0 根底层技能 SCQA模型趣谈暗码学。
SCQA模型趣谈暗码学首要分为四部分,榜首部分是加解密算法,第二部分是Hash算法,第三部分是数据编解码,终究一部分是总结与展望。
其间,加解密算法首要是分为四部分,榜首部分是对称加密,第二部分是DH交流算法,第三部分对错对称加密,第四部分是混合加密。
假如学完小木箱暗码学系列教程,那么任何人完结高功能日志组件、网络接口组件和网络优化作业,甚至迎接Web3.0都会有巨大协助。
二、加解密算法
SCQA模型是麦肯锡芭芭拉明托在《金字塔原理》中提出的“结构化表达”模板工具,常用于计划、案牍、广告、演讲、讲故事、写作等。SCQA是Situation、Complication、Question和Answer4个英文单词简称,别离是
- S—事务背景
- C—窘境冲突
- Q—剖析问题
- A—处理问题
假如你想把难以理解的暗码学常识表达清楚,那么主张选用全能表达模板—SCQA。
加密技能⽆处不在可是简略疏忽。更多的了解加密技能能做什么,不能做什么,对咱们建⽴愈加完善的信息安全意识是⾮常重要的。
加密技能的演进其实是⼀场没有硝烟的战争,在加密⽅和破解⽅惊⼼动魄的攻守战中不断完善。
接下来,咱们⾸先运用⼀个⼩故事,然后经过事务背景、窘境冲突、剖析问题和处理问题的SCQA模型⽅式学习加密技能演进,终究到达活学活用的意图。
S: 事务背景
故事的主⼈公是小木箱和粉丝。他们经过微信大众平台进行传话,小木箱给粉丝发了⼀个音讯:微信大众号小木箱生长营。
可是,音讯被潜在黑粉偷听了!
于是黑粉⽴刻阻拦了他们的信息,并把小木箱和粉丝交流联系链中断了。
C: 窘境冲突
当下面临的问题有三个。榜首个偷听问题,小木箱和粉丝交流进程中,内容是明文传输的,内容被黑粉偷听,导致信息走漏危险。
第二个是密钥配送问题,经过对称加密算法,小木箱和粉丝如同处理了信息传递的问题,可是,实际操作进程中,发现了⼀个⼤问题:怎么同享密钥?这便是密钥配送问题。
第三个问题是中心⼈进犯问题,小木箱和粉丝即使处理了密钥配送问题,不必定能确保密钥通讯安全。
黑粉经过⾃⼰的聪明才智,想到了⼀个绑架+篡改的⽅案,再次攻破了DH密钥交流和⾮对称加密,即中心⼈进犯。
Q:剖析问题
怎么处理偷听问题呢?
针对偷听问题,为了防止被黑粉偷听,小木箱和粉丝想到了⼀个好办法:首要小木箱和粉丝同享了⼀个密钥,然后小木箱先把音讯加密成密⽂,终究再发送给粉丝,粉丝拿到密⽂之后⽤密钥解密成明⽂。这便是对称加密。
怎么处理密钥配送问题呢?
针对密钥配送问题,密钥配送问题的处理⽅案有许多,有两种处理密钥配送问题⽅案:DH 交流算法和⾮对称加密算法。
怎么处理中心人进犯问题呢?
中心人进犯实质即篡改和假装,处理计划有单向散列、音讯验证码、数字签名和数字证书四种办法。
A: 处理问题
针对偷听问题,首要咱们来说说对称加密,加密办法首要解说四种加解密办法: 榜首种是DES加密,第二种是3DES加密,第三种是AES加密,第四种是ChaCha加密。
下面小木箱将从简介、前史、现状、明文块长和密钥长和加解密流程等多方面维度解说四种加解密算法。
2.1 对称加密
2.1.1 对称加密简介
加密处理办法有对称加密和非对称加密两种。
其间,对称加密指的是通讯双⽅一同把握⼀个密钥,加密解密都是由⼀个密钥完结的(即加密密钥等于解密密钥,加解密密钥能够彼此推倒出来)。
对称加密双⽅通讯前共同拟定⼀个密钥,不对第三⽅揭露,解密时运用加密进程的彻底逆进程配合密钥来进行解密。
2.1.2 对称加密手法
2.1.2.1 DES
其间,对称加密指的是加密和解密的密钥不同的加密算法。首要咱们解说一下榜首种对称加密算法DES 加密。
2.1.2.1.1 DES 简介
关于DES加密,DES,全称Data Encryption Standard,数据加密规范。
2.1.2.1.2 DES 前史
DES是1975年IBM推出,并随后在国际上⼴泛使⽤开来。
2.1.2.1.3 DES 现状
跟着核算机技能的开展,在20世纪末的时分,DES算法现已能够被暴⼒破解。在1999年的DES III ⽐赛中,只⽤了22 ⼩时多就完结了破解。所以现在不要再使⽤DES算法。
2.1.2.1.4 DES 明文块长和密钥长
DES 算法的明⽂块⻓度是64位。密钥总⻓度是64位,其间每隔7位会有⼀个⽐特的过错校验,所以有用密钥⻓度为56位。
2.1.2.1.5 DES 加解密流程
DES的加解密流程如下:
- 榜首步:DES算法的根本结构被称为Feistel⽹络。Feistel⽹络中,⼀个根本单位叫做轮,整个加密进程便是由16个轮循环组成。
- 第二步:明⽂被平分成左右两部分L0和R0。L0经过加密得到加密后的L0,作为下⼀轮的右半部分R1。R0不做处理,直接作为下⼀轮的左半部分L1。
2.1.2.1.6 DES 加密结构
DES解密和加密的结构是⼀样的(利⽤传统的换位、异或、置换等加密⽅法),具体能够参阅下面的图解。
2.1.2.1.7 DES 代码完结
github.com/strich1991/…
2.1.2.2 3DES
然后,咱们解说一下第二种对称加密算法3DES加密。
2.1.2.2.1 3DES 简介
3DES算法是将DES算法重复3次的⼀种算法。
2.1.2.2.2 3DES 前史
3DES是DES算法被攻破之后,被开发出来暂时替代DES算法的。1999年,NIST(National Institute of Standards and Technology,美国国家规范技能研究所)将3DES指定为过渡加密规范。
2.1.2.2.3 3DES 现状
3DES算法因为其处理效率不⾼,而且作为过渡规范,所以除了⼀些要向下兼容原有的DES算法的场景,现在很少被使⽤。
2.1.2.2.4 3DES 明文块长和密钥长
3DES算法的明⽂块⻓度为64位,有用密钥⻓度为56*3位。
2.1.2.2.5 3DES 加解密进程
- 3DES的加密为顺次进⾏密钥1的DES加密、密钥2的DES解密、密钥3的DES加密。
- 3DES的解密为顺次进⾏密钥3的DES解密、密钥2的DES加密、密钥1的DES
解密。
- 3DES的加密的结构是加解密替换进⾏⽽不是进⾏3次加密(考虑⼀下这是为什么?)
因为DES暗码长度简略被暴力破解,添加DES的密钥长度可反破解,因而针对每个数据块进行三次DES加密,即3DES。
组合分组办法规划的分组3DES加密算法,3DES密钥比较DES长度更长,安全性更高。
2.1.2.2.6 3DES 代码完结
github.com/songxiaolia…
2.1.2.3 AES
接着,咱们解说一下第三种对称加密算法AES加密。
2.1.2.3.1 AES 简介
AES算法,Advanced Encryption Standard,⾼级加密规范,是取代DES算法的⼀种新的对称加密规范。
2.1.2.3.2 AES 前史
AES是NIST揭露竞选得到的⼀种加密规范。能够说是先有了AES的姓名,然后竞选之后才确定的算法。终究被选中的算法叫做Rijndael算法。不过严厉来讲,AES是Rijndael的⼀种特别状况。
2.1.2.3.3 AES 现状
AES现在现已是最流⾏的对称密钥加密算法,⼴泛应⽤在各个范畴。也是咱们现在引荐使⽤的对称加密算法。
2.1.2.3.4 AES 明文块长和密钥长
AES的块⻓128位,密钥⻓度⽀持128位、192位、256位三种⻓度。(这⾥留意,Rijndael算法的块⻓和密钥⻓度,是在128-256之间的32倍数即可。
2.1.2.3.5 AES 加解密进程
AES加密进程分为两个进程,⼀是密钥扩展进程、⼀是明⽂加密进程。
A: 密钥扩展进程:
密钥扩展进程是依据⽤户密钥,经过Rijndael密钥编列算法⽣成多组128⽐特⻓的轮密钥,依据密钥⻓度,别离⽣成10组、12组和14组轮密钥。
B: 明文加密进程:
-
AES加密与DES加密⼀样,是由多轮组成。依据密钥⻓度,别离是10轮、12轮、14轮。
-
每⼀轮由以下四种运算组合⽽成:
- SubBytes,字节替换。是经过⼀个S-Box对每个字节进⾏替换操作。
- ShiftRows,⾏位移。每⼀⾏依据地点⾏数位移不同的字节数。
- MixColums,列混合。每⼀列需求跟⼀个常量矩阵相乘。
- AddRoundKey,轮密钥加。将列混合之后的成果和轮密钥做异或运算。
-
第⼀轮只要AddRoundKey运算。
-
终究⼀轮是SubBytes->ShiftRows->AddRoundKey运算。
-
中心轮都是SubBytes->ShiftRows->MixColums->AddRoundKey运算。
AES解密进程便是AES加密逆进程,小木箱不做过多解说。
2.1.2.3.5 AES 代码完结
github.com/ForTheDevel…
2.1.2.4 ChaCha20
终究,咱们解说一下第四种对称加密算法ChaCha20加密
2.1.2.4.1 ChaCha20 简介
ChaCha20算法是Google规划的一种新型流暗码算法,ChaCha命名来源于印度某漫画”Chacha Chaudhary”,20表明ChaCha20算法有20轮加密核算。
ChaCha20带Poly1305音讯认证码的ChaCha20(即ChaCha20-Poly1305),作为OpenSSL中RC4的替代品,用以完结互联网的安全通讯。
Google开端完结了HTTPS(TLS/SSL)流量在Chrome浏览器(Android手机版)与Google网站之间的通讯。
2.1.2.4.2 ChaCha20 前史
2008年,丹尼尔J伯恩斯坦发布“ChaCha”暗码宗族,意图是添加每一轮分散以提升功能。
2013年,Google提出ChaCha20-Poly1305算法,11月份在Chrome31版别启用了ChaCha20-Poly1305算法。
2014年,一切的IOS设备和Android设备上Chrome启用了ChaCha20-Poly1305算法。
firfox暗码库用的是NSS,NSS3.23版别支撑ChaCha20/Poly1305。
2.1.2.4.3 ChaCha20 现状
ChaCha20算法因为其轻量级、链路加密、密钥安全、IOT安全特征,所以更适用于ARM设备。
ChaCha20-poly1305比AES-128-GCM功能高,但因为ChaCha20 IOT安全特征,因而手机设备更适合ChaCha20-poly1305算法,电脑上更适合AES-128-GCM算法。
2.1.2.4.4 ChaCha20 明文长和密钥长
ChaCha20矩阵输入一个256位的密钥长度、64位随机数、64位计数器值以及432位的常数,常数填充在32位整型数组中作为初始矩阵。
2.1.2.4.5 ChaCha20 加解密进程
2.1.2.4.5.1 ChaCha20加密
了解ChaCha20加密之前咱们首要要熟悉三个新概念,榜首个是ChaCha20的初始矩阵,第二个是初始矩阵置换,第三个是轮函数。
首要,聊聊ChaCha20的初始矩阵,ChaCha20的初始矩阵是指输入一个256位的密钥、64位随机数、64位计数器值以及432位的常数,它们均填充在32位整型数组中作为初始矩阵。
其次,聊聊初始矩阵置换,初始矩阵置换是指 ChaCha20算法有20轮运算,其间奇数次序与偶数次序在履行轮函数前需求别离经过行置换和列置换,故20轮运算能够看作10次迭代,每次迭代先做行置换再做列置换。
接着,聊聊轮函数,轮函数是指在矩阵每次完结置换后,都需求履行一次轮函数QUARTERROUND,该函数输入为4个32位串,即4个数组中的元素,输出相同也为4个32位串,这样履行完轮函数后除了数据以外,矩阵结构未发生任何改变。
终究,聊聊ChaCha20加密进程,ChaCha20加密其实是将需求加密的信息(明文)与密钥流按位异或即得到密文,明文大于512位时,对轮函数进行20轮周期(10轮行周期+10轮列周期),初始矩阵现已变成了一个新的44矩阵,此时将新矩阵与初始矩阵矢量相加,得到的矩阵再拆分倒序序列化处理后即得到一个512位的密钥比特流。
因为计数器是32位,理论上能够生成2^512bit(256GB)的密钥流,所以一般长度的信息加密彻底满足,这便是ChaCha20加密进程。
2.1.2.4.5.2 ChaCha20解密
聊完ChaCha20加密进程,咱们再聊聊ChaCha20解密进程,接收方运用发送方传输过来的初始密钥、随机数以及洽谈好的常数和顺次递增的计数器值依照ChaCha20的密钥流生成规矩发生与加密相同的密钥流,按位与密文异或即可得到明文,这便是ChaCha20解密进程。
2.1.2.5 ChaCha20 代码完结
github.com/kitsook/Cha…
2.1.3 对称加密破解思路
说完四种加解密算法,小木箱说说对称加密算法的破解思路。
对称加密算法破解比较简略,首要拿到⼀组或多组原文-密文对,然后设法找到⼀个密钥,这个密钥能够将这些原文-密文对中的原文加密为密文,以及将密文解密为原⽂的组合,即成功破解。
2.1.4 对称加密反破解
对称加密怎么反破解呢?
⼀种优秀的对称加密算法的规范是让破解者找不到⽐穷举法(暴力破解法)更有用地破解⼿段,而且穷举法的破解时刻⾜够长(例如数千年)。
2.1.5 对称加密优缺陷
对称加密算法的长处很明显,效率高,功能高。缺陷是有密钥走漏危险,只能在安全网络上传输密钥,一旦密钥走漏则加密通讯失利。
2.1.6 对称加密效果
对称加密算法的效果在于加密通讯,防⽌信息在不安全网络上被截获后,信息被人读取或篡改。
2.1.7 对称加密分组和填充⽅式
2.1.7.1 分组方法
从上⾯的算法,咱们能够看到,输⼊的明⽂都是固定⼤⼩的块。那么关于⼀个恣意⻓度的明⽂,要怎么加密呢?
答案便是分组。下面简略介绍CBC、CTR和CFB三种分组方法。
2.1.7.1.1 CBC方法
CBC方法的全称是Cipher Block Chaining方法,密文分组链接方法。姓名中也展现CBC的实质,像链条相同彼此链接在一同。
CBC加密“链条”起始于一个初始化向量IV,这个初始化向量IV是一个随机的比特序列。
CBC加密有必要是从“链条”头开端加密,所以中心任何一个分组都无法单独生成密文。
CBC解密的时分,假如解密“链条”中心有一环“断”了,会呈现什么问题呢?
CBC解密进程中假如有一环呈现了问题,硬盘等问题呈现了,可是整个链条长度没变,如上图的状况,那么一个坏的环会影响2个分组的解密。
假如链条长度也发生改变了,或许某个分组中的1个比特位在网络传输进程中缺失了。那么影响的解密分组或许就不止2个分组了。
因为会引起整个链条上重新分组,这样一来导致原文无法解密(因为位数少于分组要求,解密的时分不会填充结尾分组缺乏的比特位)。
这一点算是CBC链式的一个“小缺陷” 。一个比特位的缺失会导致整个密文无法解析。
对CBC的进犯
因为CBC是链式的,所以进犯者能够考虑从“头”开端进犯,即进犯初始化向量IV,例如把初始化向量中的某些比特位进行0,1回转。
这样的话,音讯接收者在解密音讯的时分,明文1分组会遭到初始化向量的影响,呈现过错。
还有一种进犯办法是直接进犯密文,例如密文分组中的某个分组n被改变了,那么就会影响到明文分组n+1的解密。
2.1.7.1.2 CTR方法
CTR方法的全称是CounTeR方法(计数器方法)。CTR方法是一种经过将逐次累加的计数器进行加密来生成密钥流的流暗码。
留意上图中解密进程,中心是加密而不是解密!因为需求确保明文和密文之间异或的目标不变。不变才干异或两次复原明文。
计数器每次都会生成不同的nonce来作为计数器的初始值。这样确保每次的值都不同。
这种办法便是用分组暗码来模仿生成随机的比特序列。
对 CTR 的进犯
在被进犯方面CTR和OFB是差不多的。CTR方法的密文分组中有一个比特被回转了,则解密后明文分组中仅有与之对应的比特会被回转,这个过错不会被放大。
不过CTR方法比OFB方法比较有一个更好的长处在于,假如OFB方法某次密钥流的一个分组进行加密后生成的成果和前一次相同,那么这个分组之后的每次密钥流都不变了。
CTR方法就不会存在这一问题。
2.1.7.1.3 CFB方法
CFB方法的全称是Cipher FeedBack方法(密文反响方法)。在CFB方法中,前一个密文分组会被送到暗码算法的输入端。反响即回来输入端。
留意上图中解密进程,中心是加密而不是解密!因为需求确保明文和密文之间异或的目标不变。不变才干异或两次复原明文。
CFB整个进程很像一次性暗码本,假如把明文分组前的加密部分悉数都当作一个随机比特序列,那么就和一次性暗码本的流程相同了。由算法生成的比特序列称为密钥流。
在CFB方法中,暗码算法就适当于用来生成密钥流的伪随机数生成器,初始化向量适当于是伪随机数生成器的种子。
也因为它是伪随机数,所以CFB不具备一次性暗码本绝对无法被破译的性质的。
所以说,CFB是一种运用分组暗码来完结流暗码的办法之一。
对CFB的进犯
能够对CFB实施重放进犯(replay attack) 。
例如进犯者能够把上一次会话中的部分分组截取出来放进下次会话随机位置。
这样音讯接收者在拿到密文后进行解密,会导致其间一个分组呈现过错(上图中是明文分组2解密失利),这个时分无法判别是通讯犯错还是被人进犯所致。(想要判别需求用到音讯认证码才行,而此处仅仅单纯的CFB)
2.1.7.2 填充⽅式
在分组的前提下,假如明⽂的⻓度不能被块⻓整除的状况,就需求填充。首要有三种填充⽅式:
-
NoPadding,不填充,很少⽤。需求使⽤者确保明⽂⻓度是块⻓的整数倍。
-
ZeroPadding,缺字节填0,不缺字节填⼀个块的0。
-
PKCS7Padding,缺⼏个字节就每字节都填⼏。不缺填⼀个块的块⻓
终究,简略总结一下六种分组方法和三种填充办法
填充办法 | 特点 |
---|---|
NoPadding | 不填充,很少⽤。需求使⽤者确保明⽂⻓度是块⻓的整数倍 |
ZeroPadding | 缺字节填 0,不缺字节填⼀个块的 0 |
PKCS7Padding | 缺⼏个字节就每字节都填⼏。不缺填⼀个块的块⻓ |
关于对称加密小木箱解说到这儿了,对称加密小木箱解说了四种加密办法、对称加密破解思路、对称加密反破解、对称加密优缺陷、对称加密效果和对称加密分组和填充办法。
其间对称加密的四种加密办法分为DES加密、3DES加密、AES加密和ChaCha20加密等。
假如想了解更多暗码学常识内容,那么小木箱主张咱们经过《图解暗码技能》一书进行深度学习。下面咱们将进入DH交流算法的解说。
2.2 DH 交流算法
小木箱在加解密算法开篇说了,对称加密算法存在的窘境冲突有密钥配送问题,处理密钥配送问题的处理⽅案有许多,下⾯介绍两种常⻅的处理密钥配送问题的⽅案:DH交流算法和⾮对称加密算法。
2.2.1 DH交流算法 简介
处理密钥配送问题榜首种⽅案是DH交流算法,DH交流算法是由Diffie和Hellman在1976年发明的。
2.2.2 DH交流算法 前史含义
DH算法作为⾮对称暗码技能的⿐祖,⼀⽅⾯将加密算法的根本⼯具从代换和置换扩展到数学函数,另⼀⽅⾯⾮对称的⽅式对密钥配送、数字认证等都有极其重要的作⽤。DH算法能够说是暗码学史上最重要的⼀次⾰命。
2.2.3 DH交流算法 现状
⽬前DH算法被⼴泛应⽤在安全范畴,⽐如Https中的TLS握⼿协议等。
2.2.4 DH交流算法 理论依据
DH交流算法求模公式(axmodp)ymodp=axymodp(a^x modp)^ymodp=a^{xy}modp ,DH交流算法离散对数难题b=axmodpb=a^xmodp ,关于给定的素数a和p,已知x求b很简略,可是已知b求x很难,难度大概是O(2n)O(2^n) ,其间n是p的位数。
2.2.5 DH交流算法 进程剖析
-
小木箱选定公共参数a和p
-
小木箱挑选一个私密的参数x,而且核算出YaY_a
-
小木箱将a、p、YaY_a 一同发送给粉丝
-
粉丝选定一个私密的参数y,而且核算出YbY_b
-
粉丝将YbY_b 发送给小木箱
-
小木箱算出K=YbymodpK=Y_b^ymodp ,粉丝算出K=YaymodpK=Y_a^ymodp ,K便是二者同享的秘钥
揭露参数 | a、p、 YaY_a 和 YbY_b |
---|---|
私有参数 | x和y |
2.2.6 DH交流算法 测验代码
github.com/kelvinylon/…
2.3 非对称加密
说完处理密钥配送问题榜首种⽅案是DH 交流算法,咱们再说说处理密钥配送问题第二种⽅案非对称加密。
2.3.1 非对称加密简介
⾮对称加密便是加密和解密的密钥不同的加密算法。
2.3.2 非对称加密原理
- 能够在不可信网络大将两边的公钥传给对方,然后在发音讯前别离对音讯运用对方的公钥来加密和运用⾃己的私钥来签名,做到不可信网络上的牢靠密钥传达及加密通讯。
- 因为私钥和公钥相互可解,因而⾮对称加密还能够应⽤于数字签名技能。
- 使⽤公钥对数据进行加密得到密文;运用私钥对数据进行解密得到原数据。
2.3.3 非对称加密手法
非对称加密手法常见的手法有RSA、DSA、ECC和 ECDHE。
2.3.3.1 RSA
首要,咱们来说一下RSA算法
2.3.3.1.1 RSA 简介
1976年,两位美国核算机学家Whitfield Diffie 和 Martin Hellman,提出了⼀种崭新构思, 能够在不直接传递密钥的状况下,完结解密。
这被称为”Diffie-Hellman密钥交流算法”。这个算法启发了其他科学家。⼈们认识到,加密和解密能够使⽤不同的规矩,只要这两种规矩之间存在某种对应联系即可,这样就防止了直接传递密钥。
这种新的加密方法被称为”⾮对称加密算法”。
2.3.3.1.2 RSA 前史
1977 年,三位数学家 Rivest、Shamir 和 Adleman 在 DH 算法的启发下,规划了⼀种⾮对称加密算法,命名为 RSA 算法。
2.3.3.1.3 RSA 现状
RSA算法是使⽤最为⼴泛的⾮对称加密算法,能够说,有核算机⽹络的地⽅,就有RSA算法。
2.3.3.1.4 RSA 理论根底
涉及到互质联系、欧拉函数、欧拉定理、模反元素等数学常识。具体能够参阅阮⼀峰的 RSA算法原理
2.3.3.1.5 RSA 算法进程
2.3.3.1.5.1 加密
密文 = 明文EmodN明文^EmodN ,公钥为(E,N)
2.3.3.1.5.2 解密
明文 = 密文DmodN密文^DmodN ,公钥为(D,N)
2.3.3.1.5.3 公私钥的核算进程
-
随机挑选两个不相等的质数 p & q
-
核算 N = p* q
-
(N)=(p−1)(q−1)\varphi(N)=(p -1)(q -1)
-
随机挑选E,满意 1<E<(N)且gcd(E,(N))=11 < E <\varphi(N)且gcd(E,\varphi(N))=1
-
核算出D, 满意1<D<(N)且E∗D∗mod(N)=11 <D <\varphi(N)且E*D*mod\varphi(N)=1
-
公钥为(E,N),私钥为(D,N)
2.3.3.1.6 RSA 代码完结
github.com/ForTheDevel…
2.3.3.2 DSA
然后,咱们来说一下DSA数字签名
2.3.3.2.1 DSA 简介
DSA数字签名能够理解为是单向加密的升级,不仅校验数据完整性,还校验发送者身份,一同还因为运用了非对称的密钥来确保密钥的安全,所以比较音讯Hash算法更安全。
2.3.3.2.2 DSA 前史
DSA是美国NIST作为DSS(DigitalSignature Standard)数字签名的规范。
2.3.3.2.3 DSA 现状
DSA仅仅一种算法,和RSA不同之处在于它不能用作加密和解密,也不能进行密钥交流,只用于签名,DSA比RSA要快许多。
2.3.3.2.4 DSA 理论根底
DSA是一种更高档的验证办法,DSA是一种揭露密钥算法,不能用来加密数据,一般用于数字签名和认证。
DSA 不单单只要公钥、私钥,还有数字签名。私钥加密生成数字签名,公钥验证数据及签名。
在DSA数字签名和认证中,发送者运用自己的私钥对文件或音讯进行签名,接受者收到音讯后运用发送者的公钥来验证签名的真实性,包括数据的完整性以及数据发送者的身份。
假如数据和签名不匹配则以为验证失利!DSA数字签名的效果便是校验数据在传输进程中不被修正。
2.3.3.2.5 DSA 签名进程
- 运用音讯Hash算法将要发送数据加密生成信息摘要。
- 发送方用自己的DSA私钥对信息摘要再加密,构成数字签名。
- 将原报文和加密后的数字签名一并经过互联网传给接收方。
- 接收方用发送方的公钥对数字签名进行解密,一同对收到的数据用音讯Hash算法发生同一信息摘要。
- 将解密后的信息摘要和收到的数据在接收方重新加密发生的摘要进行比对校验,假如两者共同,则阐明在传送进程中信息没有破坏和篡改;不然,则阐明信息现已失去安全性和保密性。
2.3.3.2.6 DSA 代码完结
github.com/ForTheDevel…
2.3.3.3 ECC
其次,咱们来说一下ECC算法
2.3.3.3.1 ECC简介
ECC是 Elliptic Curves Cryptography 的缩写,意为椭圆曲线暗码编码学。和RSA算法相同,ECC算法也归于揭露密钥算法。
2.3.3.3.2 ECC前史
1985年, Koblitz 和 Miller 提出ECC算法,ECC算法的数学根底是运用椭圆曲线上的有理点构成Abel加法群上椭圆离散对数的核算困难性
2.3.3.3.3 ECC现状
因为在安全性、加解密功能、网络消耗方面有较大优势,ECC加密算法大有取代RSA成为下一代主流加密算法的趋势。如今ECC运用规模很广,在TLS、区块链(比特币、以太坊等等)、SM2国密算法、证书、银行政府组织等许多方面都有大量运用。
A: 更适合于移动互联网
ECC加密算法的密钥长度很短(256位),意味着占用更少的存储空间,更低的CPU开销和占用更少的带宽。
现在手机现已越来越遍及,跟着越来越多的用户运用移动设备来完结各种网上活动,ECC加密算法为移动互联网安全供给更好的客户体验。
B: 更好的安全性
ECC加密算法供给更强的维护,比现在的其他加密算法能更好的防止进犯,使你的网站和根底设施比用传统的加密办法更安全,为移动互联网安全供给更好的保障。
C: 更好的功能
ECC加密算法。密钥短,所以相应的核算量、消耗的内存和带宽也就少。能够用较短的密钥长度来供给更好的安全
例如,256 位的 ECC密钥加密强度等同于 3072 位 RSA 密钥的水平(现在一般运用的 RSA 密钥长度是 2048 位)。其成果是你以更低的核算才能价值得到了更高的安全性。
经国外有关威望组织测验,在 Apache 和 IIS 服务器选用 ECC算法,Web服务器呼应时刻比 RSA 快十几倍。
D: 更大的IT出资回报
ECC可协助维护您的根底设施的出资,供给更高的安全性,并快速处理爆炸添加的移动设备的安全衔接。
ECC的密钥长度添加速度比其他的加密办法都慢(一般按 128 位添加,而 RSA则是倍数添加,如:1024 – 2048 – 4096),将延伸您现有硬件的运用寿命,让您的出资带来更大的回报。
ECC算法的能够用较少的核算才能供给比RSA加密算法更高的安全强度,有用地处理了“进步安全强度有必要添加密钥长度”的工程完结问题。
2.3.3.3.4 ECC理论根底
描绘一条Fp上的椭圆曲线,常用到六个参量:T=(p,a,b,n,x,y)。
(p 、a 、b) 用来确定一条椭圆曲线;
p为素数域内点的个数;
a和b是其内的两个大数;
x,y 为G基点的坐标,也是两个大数;
n 为点G基点的阶;
以上六个量就能够描绘一条椭圆曲线,有时分咱们还会用到h(椭圆曲线上一切点的个数p与n相除的整数部分)。
2.3.3.3.5 ECC算法进程
- 选定一条椭圆曲线 Ep(a,b) 并取椭圆曲线上一点,作为基点P。
- 挑选一个大数k作为私钥,并生成公钥 Q=kP。
- 将 Ep(a,b) 和点Q、P传给用户。
- 用户接到信息后 ,将待传输的明文编码到Ep(a,b)上的一点M,并发生一个随机整数r。
- 公钥加密(密文C是一个点对):C={rP, M+rQ}
- 私钥解密(M + rQ – k(rP) ,解密成果便是点M,公式如下:
M + rQ – k(rP) = M + r(kP) – k(rP) = M
- 对点M进行解码就能够得到明文假设在加密进程中,有一个第三者H,H只能知道椭圆曲线 Ep(a,b)、公钥Q、基点P、密文点C,而经过公钥Q、基点P求私钥k或许经过密文点C、基点P求随机数r都对错常困难的,因而得以确保数据传输的安全。
2.3.3.3.6 ECC代码完结
github.com/ForTheDevel…
2.3.3.4 ECDHE
终究,咱们来说一下ECDHE算法
2.3.3.4.1 ECDHE 简介
HTTPS 常用的密钥交流算法有两种,别离是 RSA 和 ECDHE 算法。
ECDHE
全称是椭圆曲线迪菲-赫尔曼秘钥交流(Elliptic Curve Diffie–Hellman key Exchange),首要是用来在一个不安全的通道中建立起安全的共有加密资料,一般来说交流的都是私钥
,这个密钥一般作为“对称加密”的密钥而被两边在后续数据传输中运用。
2.3.3.4.2 ECDHE 前史
ECDHE 密钥洽谈算法是 DH 算法演进过来的,学好ECDHE 密钥洽谈算法前有必要学好 DH 算法,上文咱们说了 DH 算法,DH 算法对错对称加密算法, 用于密钥交流,而ECDHE 密钥洽谈算法的中心数学思想是离散对数。
2.3.3.4.3 ECDHE 现状
当多个参加方同享同一个链路的时分,联盟链各参加方想要在同一个链路上完结通性的阻隔,运用ECDHE
算法既能够完结TCP链接的复用,防止频频建立大量链接,又能够确保同一链接间的通讯阻隔。
2.3.3.4.4 ECDSA 签名算法
Alice想要用私钥签名一个数据,Bob想要运用Alice的公钥验证这个签名;只要Alice能够进行核算签名然后得到签名,每个人都能验证签名值。
首要,Alice和Bob具有相同的椭圆曲线参数,算法被签名称之为ECDSA,是DSA算法的一个变体。
然后,ECDSA签名算法的输入是数据的hash值,而不是数据的自身,hash算法可自选且hash值会被截断。
终究,Alice运用私钥da对z进行签名,生成二元组(r, s)。Bob运用Alice的公钥对(r, s)和Z进行验证。
Bob的验证进程为:
-
核算u1 = s^-1 * z mod n
-
核算u2 = s^-1 * r mod n
-
核算P = u1G + u2Ha
-
假如r == xp mod n,则验证正确
需求留意的是:
当咱们运用ECDSA进行签名的时分,k的保密性十分重要。假如咱们对一切的签名操作都用相同的k或许咱们的随机数生成器存在可预测性,一个进犯者或许会猜出私钥。
2.3.3.4.5 ECDHE 算法进程
首要,两边约定运用ECDHE
秘钥交流算法,这个时分两边也知道了ECDHE
算法里的一个大素数P
,这个P
能够看做是一个算法中的常量。
P
的位数决议了进犯者破解的难度
还有一个整数g
用来辅佐整个秘钥交流,g
不必很大,一般是2或许5,两边知道g
和p
之后就开端了ECDH
E交流秘钥的进程了。
Alice知道了共用参数p
和g
,生成私有整数a
作为私钥,公钥算法一般是公钥加密,私钥解密,公钥给对方来加密数据,拿到密文后私钥解密检查内容正确性,这个时分Alice直接经过线路告知Bob自己的私钥a
显然既不合理也是一件危险很大的事。
这个时分Alice需求运用p
,g
,a
经过公式g^a mod p = A
生成A作为公钥传递。
Bob经过链路收到Alice发来的p
,g
,A
,知道了Alice的公钥A
。这个时分Bob也生成自己的私钥b
,然后经过公式g^b mod p = B
生成自己公钥B
。
在发送公钥B
前,Bob经过A^b mod p = K
生成K作为公共秘钥,可是并不发送给Alice,只经过链路发送B
。
Alice收到Bob发来的公钥B
以后,相同经过B^a mod p = K
生成公共秘钥K,这样Alice和Bob就经过不传递私钥a
和b
完结了对公共秘钥K的洽谈。
2.3.3.4.6 ECDHE 代码完结
github.com/akhawaja/ja…
2.3.4 非对称加密进程
咱们还是从小木箱和粉丝来看⼀下这个进程。
- ⾸先,粉丝⽣成两个密钥,公钥 B 和私钥 B。公钥 B 是能够揭露的,私钥 B 是⾃⼰保管。
- 然后, 粉丝把 公钥 B 发送给 小木箱,小木箱将明⽂经过公钥 B 来加密成密⽂,发送给粉丝。
- 接着, 粉丝经过私钥 B 解密密⽂,得到明⽂。
- 这个进程中,黑粉即便截获了公钥 B 和密⽂,也⽆法解密。
2.3.5 非对称加密优缺陷
非对称加密的长处是什么?
能够在不安全⽹络上传输密钥,能够处理“密钥交流”的问题。网站隐秘保管私钥,在网上恣意分发公钥,你想要登录网站只要用公钥加密就行了,密文只能由私钥持有者才干解密。
为什么不直接运用非对称加密?
非对称加密因为运用了杂乱了数学原理,因而核算适当杂乱,假如彻底运用⾮对称加密来加密通讯内容,会严重影响⽹络通讯的功能。非对称加密的缺陷是核算杂乱,因而功能相⽐对称加密差许多。
2.3.6 非对称加密破解
和对称加密不同之处在于,⾮对称加密的公钥很简略获得,因而制作原文-密文对是没有困难的事。
⾮对称加密的要害只在于,怎么找到⼀个正确的私钥,能够解密一切经过公钥加密过的密⽂文。找到这样的私钥即为成功破解。
⾮对称加密的自身特性,怎样经过公钥来推断出私钥一般是一种思路(例如 RSA),但往最佳手法依然是穷举法。
仅仅和对称加密破解的区别在于,对称加密破解是不断测验自己的新密钥是否能够将⾃⼰拿到的原文-密文对进行加密和解密,而非对称加密时不断测验自己的新私钥是否和公钥相互可解。
2.3.7 非对称加密反破解
⾮对称加密算法优秀的规范相同在于,让破解者找不到⽐穷举法更有用的破解手法,而且穷举法的破解时刻满足长。
2.4 混合加密
说完非对称加密,咱们再聊聊混合加密
2.4.1 混合加密简介
混合加密是结合对称加密和非对称加密各自长处的一种加密办法。
混合加密具体的完结思路是首要运用对称加密算法对数据进行加密,然后运用非对称加密算法对 对称加密的密钥进行非对称加密,终究再把加密后的密钥和加密后的数据发送给接收方。
2.4.2 混合加密进程
在对数据安全要求较高的场景或传输敏感数据时,咱们就能够考虑运用前面的混合加密计划对提交到服务端的数据进行混合加密,当服务端接收到对应的加密数据时,再运用对应的解密算法对加密的数据进行解密,然后进一步进行数据处理。
可是假如服务端也要回来敏感数据时,应该怎么办呢?能够参阅下面的混合加密技能计划
2.4.3 混合加密技能计划
① 生成一个仅有的 reqId(恳求 ID),用于标识当时恳求;
② 别离生成一个随机的 AES Key 和 AES IV(选用 AES CBC 方法);
③ 选用 RSA 非对称加密算法,别离对 AES Key 和 AES IV 进行 RSA 非对称加密;
④ 选用随机生成的 AES Key 和 AES IV 对敏感数据进行 AES 对称加密;
⑤ 把 reqId 作为 key,AES Key 和 AES IV 组成的目标作为 value 保存到 Map 或 {} 目标中;
⑥ 把 reqId、加密后的 AES Key、AES IV 和加密后的数据保存到目标中提交到服务端;
⑦ 当服务端接收到数据后,对接收的数据进行解密,然后运用客户端传过来的解密后的 AES Key 和 AES IV 对呼应数据进行 AES 对称加密;
⑧ 服务端在完结数据加密后,把 reqId 和加密后的数据包装成呼应目标,回来给客户端;
⑨ 当客户端成功接收服务端的呼应后,先获取 reqId,进而从保存 AES Key 和 IV 的 Map 获取该 reqId 对应的 AES 加密信息;
⑩ 客户端运用当时 reqId 对应的加密信息,对服务端回来的数据进行解密,当完结解密之后,从 Map 或 {} 目标中删去已有记载。
咱们来对上述流程做个简略剖析,首要 AES 加密信息都是随机生成的且依据每个恳求独立地保存到内存中,把 AES 加密信息中的 Key 和 IV 提交到服务端的时分都会运用 RSA 非对称加密算法进行加密。
在服务端回来数据的时分,会运用当时恳求对应的 AES 加密信息对回来的成果进行加密,一同回来当时恳求对应的 reqId(恳求 ID)。即服务端不需求再生成新的 AES 加密信息,来对呼应数据进行加密,这样就不需求在呼应目标中传递 AES 加密信息。
2.4.4 混合加密代码完结
github.com/Ccapton/and…
三、Hash算法
说完混合加密,咱们说说Hash算法,Hash算法又叫摘要算法
3.1 Hash算法概念
Hash算法实质数据结构是散列函数、Hash函数,Hash算法用来完结完整性,能够为数据生成独一无二的“指纹”,因为不可逆性, Hash算法不是加密算法,不能用于加密(因为无法经过Hash反推明文),只能用于防篡改,可是它的单向核算特性决议了能够在不存储明文口令的状况下验证用户口令
3.2 Hash算法效果
Hash算法的效果有三个,榜首个是防止直接看到明文,比如TLS安全通讯防中心人进犯,第二个是防抵赖(数字签名),第三个是大文件比较。下面咱们侧重解说防中心人进犯流程
3.3 防中心人进犯流程
小木箱和粉丝处理了密钥配送问题,这下能够隐秘通讯了吧?没那么简略,黑粉经过⾃⼰的聪明才智,想到了⼀个绑架+篡改的⽅案,再次攻破了 DH 密钥交流和⾮对称加密。这个便是⼤名⿍⿍的中心⼈进犯。
中心⼈进犯,反响了加密国际中的两⼤问题:篡改和假装。这个难题怎么处理呢?
3.3.1 单向散列
3.3.1.1 Hash简介
⾸先介绍咱们的第⼀个兵器:单向散列,简称Hash
单向散列函数也叫Hash函数、摘要函数、杂凑函数等,是单向的把恣意⻓的输⼊音讯串改变成固定⻓的⼀种函数。
单向散列函数能够把恣意数据转换成指定巨细规模(一般很小,例如 256 字节以内)的数据。
3.3.1.2 Hash特点
-
第⼀个是输⼊不定⻓,输出定⻓。
-
抗磕碰性。
- 2.1 弱磕碰性:找到和给定音讯散列值相同的别的⼀条音讯难。
- 2.2 强磕碰性:找到给定散列值的两条音讯难。
-
单向性,⽆法经过输出反向核算出输⼊。
-
核算快速。
3.3.1.3 Hash算法
-
MD5 算法。现已被攻破,不再引荐使⽤。
- github.com/ForTheDevel…
-
CRC32 算法。在数据紧缩范畴被作为完整性校验
- github.com/MasGaNo/cor…
-
SHA1 算法。现已被攻破,不再引荐使⽤。
- github.com/xiebiao/Sha…
-
SHA2 算法。包括常⻅的 SHA256、SHA512 算法等。
- github.com/meyfa/java-…
-
SHA3 算法。是 NIST 选拔的算法,引荐使⽤。
- github.com/ForTheDevel…
-
MAC 算法。 MD5 和 SHA 结晶,安全程度高。 商业银行中POS 终端加密常用算法。
- github.com/ForTheDevel…
3.3.1.4 Hash效果
Hash适当于从数据中提出摘要信息,因而最首要⽤途是数字指纹。
3.3.1.5 Hash常见问题
Hash是编码吗?
不是,Hash 是单向进程,往往是不可逆的,⽆法进行逆向恢复操作,因而 Hash 不归于编码。
Hash是加密吗?
不是,Hash 是单向进程,⽆法进行逆向回复操作,因而 Hash 不归于加密。(记住,MD5 不是加密)
3.3.1.6 Hash用处
Hash实际用处有四个,榜首个是仅有性验证,第二个是数据完整性验证,第三个是快速查找,终究一个是隐私维护
-
唯⼀性验证
- 例如 Java 中的 hashCode() ⽅法。
- 把 equals() ⽅法中的每个用于判别相等的变量都放进 hashCode() 中,一同生成一个尽量量不会磕碰的整数即可
-
数据完整性验证
- 从⽹络上下载文件后,经过比对文件的 Hash 值(例如 MD5、SHA1),能够确认下载的文件是否有损坏。假如下载的⽂件 Hash 值和文件供给方给出的 Hash 值共同,则证明下载的⽂文件是完好⽆损的。
-
快速查找
- HashMap
-
隐私维护
- 当重要数据有必要露出的时分,有事能够挑选露出它的 Hash 值(例如 MD5),以保障原数据的安全。
- 例如⽹站登录时,能够只保存用户暗码的 Hash 值,在每次登录验证时只需求将输⼊的暗码的 Hash值和数据库中保存的 Hash 值作比对就好,网站⽆需知道用户的暗码。
- 这样,当⽹站数据失窃时,⽤户不会因为⾃己的暗码被盗导致其他网站的安全也遭到要挟。
说完了单向散列,咱们会发现,篡改和假装的问题都没有彻底处理。这个难题怎么优化呢?
3.3.2 音讯验证码
3.3.2.1 MAC简介
在单向散列算法中引⼊⼀个同享秘钥,这样散列+加密的成果便是咱们的音讯验证码。
3.3.2.2 MAC作⽤
因为音讯验证码只要具有同享密钥的⼈才干算出。这样就处理了假装和篡改的问题。
3.3.2.3 MAC使⽤
假如初始音讯是很长的句子,那么初始音讯被篡改后意思会变得很奇怪,所以接收者有或许会发现初始音讯是被篡改过的。
可是,假如初始音讯便是商品编号等无法被人们直接理解的内容,那么解密后接收者便很难判别初始音讯是否被篡改。因为暗码自身无法告知人们音讯是否被篡改,所以就需求运用音讯认证码来检测初始音讯是否真伪。也便是咱们说的MAC
3.3.2.4 HMAC算法
HMAC 是Keyed-Hashing for Message Authentication的缩写。
HMAC的MAC算法是hash算法,HMAC能够是MD5、SHA-1或SHA-256。
他们别离被称为HMAC-MD5、HMAC-SHA1或HMAC-SHA256。
音讯验证码在⼀定程度上处理了篡改和假装的问题。那么怎么进一步优化呢?
3.3.3 数字签名
3.3.3.1 数字签名简介
音讯验证码是在单向散列的根底上引⼊了⼀个同享秘钥。
而数字签名则是在单向散列的根底上引⼊了⼀对公私钥
3.3.3.2 数字签名运用
数据签名场景是假如想要将数据更小,那么首要,对原数据hash,然后,hash签名附加在原数据后⾯,终究,作为签名即可。流程图参阅如下:
3.3.3.3 数字签名长处
对⽐音讯验证码,数字签名能够额定处理“⽆法向第三⽅证明” 和 “否认” 两个问题。
3.3.3.4 数字签名原理
数字签名技能是运用算法(一般对错对称算法)经过Hash(仅个人一切)加密,生成数字签名,与原文一同传送给接收者。
接收者只要用发送者的公钥才干解密被加密的信息,然后对内容履行Hash运算得到Hash值,与解密得到的数字签名Hash值比对。
假如比对成果共同,则阐明收到的信息是完整的,在传输进程中没有被篡修正的,不然信息必定被修正过
3.3.3.5 与⾮对称加密的联系
数字签名也是⾮对称加密算法的应⽤,对⽅⽤公钥加密,我⽤私钥解密,便是⾮对称加密在音讯传递上的应⽤。我⽤私钥加密,对⽅⽤公钥解密,便是数字签名。
数字签名还是要有⼀对公私钥,所以还是存在中心⼈进犯的问题的。那么咱们该怎么治理这个问题呢?
3.3.4 数字证书
咱们引⼊了数字证书来处理中心⼈进犯的问题。
3.3.4.1 CA简介
数字证书,涉及到⼀个第三⽅的公平组织,Certificate Authority,也便是 CA。公钥的分发需求运用数字证书,有必要由 CA 的信赖链来验证,不然便是不可信的;
3.3.4.2 CA作业流程
服务器向CA中心请求证书,CA负责核实服务器的真实性,并在证书里内置服务器域名证书运用者信息客户浏览器或操作系统里内置有威望CA的公钥信息(即CA公钥不需求在网络中传输)
客户恳求服务时,服务器把自己请求的数字证书和内容的数字签名一同发给客户
客户收到信息后在本地CA列表里查找CA公钥对数字证书解密,拿到真实的签名公钥,再用该公钥去解密数字签名,拿到HASH值去比照完整性
3.3.4.3 CA验证进程
-
检验根本信息
- 首要,浏览器读取证书中的证书一切者、有用期等信息进行一一校验
-
校验CA组织
- 然后,浏览器开端查找操作系统中已内置的受信赖的证书发布组织CA,与服务器发来的证书中的颁布者CA比对,用于校验证书是否为合法组织颁布;假如找不到,浏览器就会报错,阐明服务器发来的证书是不可信赖的。
-
解密证书
- 假如找到,那么浏览器就会从操作系统中取出颁布者CA的公钥,然后对服务器发来的证书里面的签名进行解密
-
比对hash值
- 其次,浏览器运用相同的hash算法核算出服务器发来的证书的hash值,将这个核算的hash值与证书中签名做比照
终究,比照成果共同,则证明服务器发来的证书合法,没有被假充,浏览器能够读取证书中的公钥,用于后续加密
好了,利⽤上⾯这些兵器,小木箱和粉丝终于能够联系和信赖了。
3.4 Hash算法危险
Hash算法的危险在于磕碰,伪造证书进犯, 作为信赖链的源头 CA 有时也会不可信,处理办法有 CRL、OCSP,还有停止信赖,或许两个不同的数据经过某个Hash算法得到了相同的摘要
四、数据编解码
说完Hash算法,咱们再聊聊数据编解码,依据5W2H剖析法,咱们将从编解码价值、编解码原因、编解码时机和编解码方法和运用五个维度解说数据编解码
4.1 编解码简介
编码是信息从一种方法转换为另一种方法的进程。不同字符对应的二进制数的规矩。
解码是编码的逆进程,解码将存储在核算机的二进制转换为能够看到的字符。
4.2 编解码价值
数据编解码是可逆的,数据编解码中心价值有两个。榜首个是确保数据的准确性,必定程度上防止数据传输进程中被恣意改造。第二个是为了便利数据存储和紧缩。
4.3 编解码原因
未紧缩的数据量十分大,存储困难,一同也不便于在网络中传输。
因而,数据编解码的最首要效果是将非规范格局的数据转为某种协议的规范格局,使这种协议能够传输、处理这种数据。
4.4 编解码时机
当咱们在存储和传输数据的进程中,假如不改变数据空间结构加密数据,或不躲藏数据空间结构解密,那么咱们能够考虑对数据进行编解码。数据加解密和数据编解码实质区别是数据加解密是对数据躲藏和维护,数据编解码是便利存储和传输数据。
4.5 编解码方法和运用
数据编解码有四种方法,榜首种方法是Base64编解码,第二种方法是Hex编解码,第三种方法是URL编解码,第四种方法是紧缩与解压。
4.5.1 Base64编解码
首要咱们说说榜首种方法Base64编解码
4.5.1.1 Base64界说
Base64是将⼆进制数据转换成由 64 个字符组成的字符串的编码算法
4.5.1.2 Base64用处
Base64将⼆进制数据扩充了贮存和传输途径(例如能够把数据保存到⽂本文件、能够经过聊天对话框或短信方法发送⼆进制数据、能够在 URL 中加入简略的二进制数据)。
一般的字符串在经过Base64 编码后的成果会变得⾁眼不可读,因而能够适用于必定条件下的防窃视(较少用)。
4.5.1.3 Base64缺陷
因为⾃身的原理(6 位变 8 位),因而每次 Base64 编码之后,数据都会增大约 1/3,所以会影响存储和传输功能。
4.5.1.4 Base64问题
Base64加密图⽚传输更安全和高效?
Base64并不是加密, 别的,Base64 会导致数据增大 1/3,降低⽹网络功能,增⼤用户流量开销,是画蛇添⾜的手法。
Base64 对图⽚进行编码用处在于有时需求运用文本方法来传输图片。除此之外,彻底没必要运用Base64对图片进行额定处理。
4.5.2 Hex编解码
然后咱们说说第二种方法Hex编解码,
4.5.2.1 Hex编解码界说
Hex编码(十六进制编码)便是运用数字0到9加上字母A到F总共16个字符表明的一种编码解码办法,其间A到F适当于十进制的10到15,总计16个,这些称作十六进制数字。
常见的编解码办法如下:
# abc这3个英文字符会被echo编码为3个字节,然后被xxd编码为6个hex字符
$ echo -n abc|xxd -ps
616263
# 解码hex数据
$ echo 616263|xxd -ps -r
abc
4.5.2.2 Hex编解码用处
Hex编码最常用于二进制文件检查时展现的编码,如Hex Fiend就能够支撑检查二进制文件。
4.5.2.3 Hex编解码场景
在XML、JSON等文本中包括不可见数据(二进制数据)时运用
4.5.2.4 Hex编解码代码
4.5.2.4.1 将字节数组转换为字符串
/**
* 将字节数组转换为字符串
* 一个字节会构成两个字符,终究长度是原始数据的2倍
* @param data
* @return
*/
public static String toHex(byte[] data){
String ret = null;
//TODO 将字节数组转换为字符串
if (data != null && data.length>0) {
StringBuilder sb = new StringBuilder();
for (byte b: data){
//别离获取高四位,低四位的内容,将两个数值,转为字符15
int h = (b>>4)&0x0f;
int l = b&0x0f;
char ch ,cl;
if( h > 9 ){
ch = (char) ('A'+(h-10));
}else{ //0--9
ch = (char) ('0'+h);
}
if(l>9){
cl = (char) ('A'+(l-10));
}
sb.append(ch).append(cl);
}
ret = sb.toString();
}
return ret;
}
4.5.2.4.2 将字符串转换为字节数组
public static byte[] fromHex(String str) {
byte[] ret = null;
//TODO 将Hex编码的字符串,复原为 原始的字节数组
if (str != null) {
int len = str.length();
if (len > 0 && len % 2 == 0) {
char[] chs = str.toCharArray();
ret = new byte[len / 2];
for (int i = 0, j = 0; i < len; i += 2, j++) {
char ch = chs[i]; char cl = chs[i + 1];
int ih = 0, il = 0, v = 0;
if (ch >= 'A' && ch <= 'F') {
ih = 10 + (ch - 'A');
} else if (ch >= 'a' && ch <= 'f') {
ih = 10 + (ch - 'a');
} else if (ch >= '0' && ch <= '9') {
ih = ch - '0';
}
if (cl >= 'A' && cl <= 'F') {
il = 10 + (cl - 'A');
} else if (cl >= 'a' && cl <= 'f') {
il = 10 + (cl - 'a');
} else if (cl >= '0' && cl <= '9') {
il = cl - '0';
}
v = ((ih & 0x0f) << 4) | (il & 0x0f);
//赋值
ret[j] = (byte) v;
} }
return ret;
}
4.5.3 URL编解码
接着咱们说说第三种方法URL编解码。
4.5.3.1 URL编解码界说
URI 是用来标记互联网上资源的一个姓名,由“协议名 + 主机名 + 路径”构成,俗称URL
4.5.3.2 URL编解码用处
Url的编码格局选用的是ASCII码,ASCII的用处便是运用安全的字符(没有特别用处或许特别含义的可打印字符)去表明那些不安全的字符。
4.5.3.3 URL编解码场景
- Size过大
- 包括隐私数据
- URL字符有歧义
4.5.3.4 URL编解码问题
哪些字符需求编码?
- 英文字母(a-zA-Z)
- 数字(0-9)
- -_.~4个特别字符
- 一切保存字符
怎么对不合法字符进行编码?
-
关于非ASCII字符,需求运用ASCII字符集的超集进行编码得到相应的字节,然后对每个字节履行百分号编码。
-
如”中文”运用UTF-8字符集得到的字节为0xE4 0xB8 0xAD 0xE6 0x96 0x87,经过Url编码之后得到”%E4%B8%AD%E6%96%87″。
-
假如某个字节对应着ASCII字符会集的某个非保存字符,则此字节无需运用百分号表明。
- Url编码”,运用UTF-8编码得到的字节是0x55 0x72 0x6C 0xE7 0xBC 0x96 0xE7 0xA0 0x81,因为前三个字节对应着ASCII中的非保存字符”Url”
- 因而这三个字节能够用非保存字符”Url”表明。终究的Url编码能够简化成”Url%E7%BC%96%E7%A0%81″
-
-
关于Unicode字符,RFC文档主张运用utf-8对其进行编码得到相应的字节,然后对每个字节履行百分号编码。
4.5.4 紧缩与解压
其次咱们说说第四种紧缩与解压。
4.5.4.1 紧缩与解压界说
紧缩是指将数据运用更具有存储优势的编码算法进⾏编码。而解压是指将紧缩数据解码复原成本来的方法,以便利运用。
4.5.4.2 紧缩与解压用处
紧缩与解压⽬的是减小数据占用的存储空间。
4.5.4.3 紧缩与解压问题
问题1: 紧缩是编码吗?解压是解密进程吗?
是,所谓编码,即把数据从一种方法转换为另一种方法。紧缩进程归于编码进程,解紧缩进程归于解码进程。
问题2: 常见的紧缩算法有哪些?
常见的紧缩算法有五种,别离是 Gzip、Deflate、Brotli、JPEG和MP3
-
Gzip
- Gzip是GNU zip 紧缩格局,也是互联网上最盛行的紧缩格局
-
Deflate
- zlib(deflate)紧缩格局,盛行程度仅次于gzip
-
Brotli
- Brotli是一种专门为 HTTP 优化的新紧缩算法(Brotli)
-
Jpeg
- JPEG图画紧缩算法流程详解
-
MP3
-
MP3文件原理
-
问题3: 什么是图⽚、音频与视频编解码?
图⽚、音频和视频编解码是指将图画、音频、视频数据经过编码来转换成存档方法(编码),以及从存档方法转换回来(解码)。
问题4: 图⽚、音频与视频编解码有什么用?
图⽚、音频与视频编解码意图是存储和紧缩媒体数据(⼤多数媒体编码算法会紧缩数据,但不是悉数)。
问题5: 什么是图⽚紧缩粗犷算法?
图⽚紧缩粗犷算法常见案例是将⼀张纯⽩(⽩⾊的 16 进制数值为 0xffffff)的 64×64 不透明像素图⽚,原数据格局⼤致为:
width:64;height:64;ffffffffffffffffffffffffffffffffffffffffffffffffffffffff
fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff.......f
fffff
运用某种算法后:
width:64;height:64;ffffff:[0,0]-[63,63]
这便是图⽚紧缩粗犷算法,经过字符集测量办法减少图片体积。
4.6 序列化和编解码比较
加解密算法快完毕了,同学或许会将序列化和编解码混杂,下面就简略比较一下序列化和编解码简略的差异。
4.6.1 序列化界说
序列化是指把数据目标(⼀般是内存中的,例如 JVM 中的目标)转换成字节序列的进程。
目标在程序内存里的寄存方法是散乱的(寄存在不同的内存区域、而且由引用进行衔接),经过序列化能够把内存中的目标转换成⼀个字节序列,然后运用 byte[] 等方法进行本地存储或网络传输,在需求的时分重新组装(反序列化)来使⽤。
4.6.2 序列化用处
序列化意图是让内存中的目标能够被贮存和传输。
4.6.3 序列化和编解码区别
序列化不是编码,编码是把数据由一种数据格局转换成另一种数据格局,而序列化是把数据由内存中的目标(而不是某种具体的格局)转换成字节序列。
五、总结与展望
这一节,首要分为四部分,榜首部分是加解密算法,第二部分是Hash算法, 第三部分是数据编解码,终究一部分是总结与展望。其间,加解密算法首要是分为四部分,榜首部分是对称加密,第二部分是DH交流算法,第三部分对错对称加密,第四部分是混合加密。
熟悉暗码学关于移动端开发者自界说数据格局、字符编解码和高功能日志库完结尤为重要,假如想成为一名不被年代遗弃的Android开发者,那么深层次的了解加解密,并在合适的场景运用加解密,不仅能全方面构建全链路技能栈,而且为行将到来的Web3.0技能风口奠定了理论根底。
下一节,小木箱将带咱们从安卓签名机制、TLS握手协议、支付中台建设和日志安全等维度解说暗码学在移动端运用与实践。
假如咱们对小木箱的文章感兴趣,那么欢迎重视小木箱微信大众号小木箱生长营。小木箱生长营,一个专注移动端根底技能的互联网生长社区。
参阅资料
- blog.netlab.360.com/malware-spe…
- www.wangan.com/p/11v71d467…
- halfrost.com/symmetric_e…
- developer.aliyun.com/article/952…
- thiscute.world/posts/pract…
- tkxb.wordpress.com/2020/03/08/…
- developer.aliyun.com/article/952…
- 《加密与解密》