写在前面:加密和签名是两回事,加密的目的是防止信息泄露,签名的目的是防止篡改和伪造
MD5、SHA-1、SHA-256、HMAC-SHA256等属于哈希算法,计算数字摘要,不可逆,有碰撞
DES、AES、RSA等属于加密算法,对数据进行加解密,可逆
对称加密和非对称加密
简单理解:对称加密就是加密、解密的密钥相同,非对称加密就是加密、解密的密钥不同
对称加密的优点
速度快
对称加密的缺点
密钥的管理与分配
- 当双方持有永久密钥时,无法完全信任对方,出现安全事故无法明确责任归属
- 当每次使用随机密钥时,如何把密钥安全的发送到需要解密你的消息的人的手里是一个问题。在发送密钥的过程中,密钥有很大的风险会被黑客们拦截。现实中通常的做法是将对称加密的密钥进行非对称加密,然后传送给需要它的人。
非对称加密的优点
密钥的管理与分配
非对称加密为数据的加密与解密提供了一个非常安全的方法,它使用了一对密钥,公钥(public key)和私钥(private key)。私钥只能由一方安全保管,不能外泄,而公钥则可以发给任何请求它的人。非对称加密使用这对密钥中的一个进行加密,而解密则需要另一个密钥。
非对称加密可以私钥加密、公钥解密,也可以公钥加密、私钥解密。由私钥可以得到公钥,可以认为由公钥无法得到私钥。
非对称加密的缺点
速度慢,加解密的数据越大越慢
网络通信的简单加密方案
- 接口的提供方A生成一个公私钥对(pub、pri)
- 将私钥pri自己保存,将公钥pub提供给接口的调用方B
- B生成一个对称加密的密钥key,用公钥pub加密得到secret_key,将明文用密钥key加密得到密文,将密文和secret_key传输给A
- A用私钥pri解密secret_key得到密钥key,在用密钥key解密密文得到明文
备注:如果多个调用方,可以使用相同的公钥,也可以分别分配公私钥对,视情况而定。
比如ssl协议就类似于上述方案,可以选择直接使用https
如果将非对称加密的公钥放在网络中传输,需要注意中间人攻击
A、B间通信,中间人C
- C劫持A发给B的公钥
- C自己生成一个公钥,再发给B
- B用C给的公钥生成一个对称加密的密钥key,用公钥加密得到secret_key,将明文用key加密得到密文,将密文和secret_key传输给A
- C劫持B发给A的信息
- C用自己的私钥解密secret_key得到密钥key,在用密钥key解密密文得到明文
- C用A的公钥加密key,将密文和secret_key传输给A
为了防止中间人攻击,出现了数字证书技术
数字证书
- 双方通信内容的安全性是靠公钥加密、私钥解密来保证的,这一安全性由非对称加密的特性,即由公钥加密的信息只能使用对应的私钥才能解开来保证。由于私钥不会传递,只有拥有者知道,所以安全性就由公钥的正确性来保证。
- 公钥由对方在通信初始所提供,但是这时很容易被中间人替换掉,为了保证公钥的正确性,所以在发送公钥的时候也会提供对应的数字证书,用于验证这个公钥是对方的而不是中间人的。那么安全性就是由数字证书的正确性来保证了。
- 数字证书是由上级CA签发给个人/组织的,上级CA用自己的私钥给个人证书进行签名,保证证书中的公钥不被篡改,而接受者需要用上级 CA 证书中的公钥来解密个人数字证书中的数字签名来验证证书中的公钥是否是正确的。那么安全性就是由上级CA证书的正确性保证的了。
- 但是,上级CA证书也是由其上级CA签发的,这种信任关系一直到根证书。根证书没有上级CA为其签名,而是自签名的,也就是说,它自身为自身签名,保证正确性。所以根证书就是这个信任链最重要的部分。如果根证书泄露的话,其签名的所有证书及使用其签名的证书所签名的证书的安全性将不复存在。现在,安全性就是靠系统根证书的私钥不被泄露或者其公钥不被篡改来保证的了。
- 根证书不应该通过网络分发,因为通过网络分发的话,可能会被中间人攻击。一般根证书都通过操作系统或者浏览器分发,在操作系统中会内置很多根证书,但是最初的操作系统也不能通过网络分发,因为中间人可以修改操作系统中的根证书。所以要保证安全只能靠最原始的方法,当面交流。硬件厂商会和证书签发机构合作,在电脑、手机等设备出厂的时候在其操作系统中内置签发机构的根证书,再将这些设备分发出去,这样,这些设备的用户就可以安全地进行信息交换了。所以,安全性就依赖于这些设备在分发到消费者手中之前不会被恶意修改来保证了。
对称加密算法
DES
已被淘汰,不要使用
3DES
从DES到AES的过渡算法,不推荐使用
AES
参考资料:AES算法简介
密钥位数
明文分组的长度为128位即16字节,密钥长度可以为128、192 和 256 位。通常我们所说的AES的KEY,实际上是生成密钥的种子
AES五种加密模式
ECB(最简单,易被攻击)、CBC(推荐)
参考资料:AES五种加密模式
扩展阅读:分组密码各种模式比较
CBC模式的IV
长度16字节,默认为16个0,也可以自己指定,由于是分组加密,所以下一组的iv,就用前一组的加密的密文来充当
CBC模式解读
参考资料:CBC模式解读
非对称加密算法
非对称加密算法需要两个密钥:公开密钥(publickey)和私有密钥(privatekey)。公开密钥与私有密钥是一对,如果用公开密钥对数据进行加密,只有用对应的私有密钥才能解密;如果用私有密钥对数据进行加密,那么只有用对应的公开密钥才能解密。因为加密和解密使用的是两个不同的密钥,所以这种算法叫作非对称加密算法
RSA
参考资料:
RSA的安全基础
对极大整数做因数分解的难度决定了RSA算法的可靠性。目前仍然没有可靠的方法攻击RSA,只能进行暴力破解,从公开的资料来看,目前被破解的最长RSA密钥是768位(有实锤的)
RSA密钥长度
主流一般是1024bit或者2048bit
RSA也是分块加密
块的大小由秘钥长度和补位方式决定,例如密钥1024bit(128字节),pkcs1padding:加密的块最大是128-11=117字节,解密的块最大是128字节。超出则需要分块,不足则需要补位。
PKCS#1 PKCS#8
- PKCS#1:定义RSA公开密钥算法加密和签名机制。
- PKCS#8:描述私有密钥信息格式,该信息包括公开密钥算法的私有密钥以及可选的属性集等。
pkcs8协议和私钥有关,如果私钥对应的协议不同,加解密会有问题
密码学之Padding(填充)
在加密算法中,明文通常是由固定长度的块组成,这就需要对明文进行填充。由于使用的第三方工具包不同,尤其是跨语言的情况下,其默认使用的pkcs协议或padding协议可能不同,导致在解密时出现问题。
-
pkcs1padding(v1.5):
- E = 00 + F + P + 00 + D
- E:为转化后Hex进制表示的数据块,长度为128个字节(密钥1024位的情况下)
- 00:开头为00。可能是一个保留位。因为目前F的类型至于三种(00,01,02)一个字节就可以表示。
- F:用一个字节表示,目前有三个值00 01 02,如果公钥加密,F永远为02,如果是私钥加密则可能为00或01。
- P:为填充位P由k-3-D这么多个字节构成,k表示密钥的字节长度,如果我们用1024bit的RSA密钥,这个长度就是1024/8=128 ,D表示明文数据D的字节长度。P的长度最小8字节
- 对于F为00的,则P全部为00,对于F为01的P全部为FF,对于F为02的,P的值随机产生但不能是00。
- 00:在源数据D前一个字节用00表示
- D:实际源数据
- 当D以00开头时,F不能为00,只能为01
- D=密钥长度-补位长度(最小8)-3,所以在1024位密钥的情况下加密块最大为117字节
-
pkcs7padding:
- 假设待加密数据长度为x,BlockSize为y,那么将会在后面padding的字节数目为y-(x%y),每个padding的字节值是y-(y%8)。
- 但是,当待加密数据长度x恰好是y的整数倍,也是要在后面多增加y个字节,每个字节是0x0y。
- 例:待加密数据长度9:0x410x410x410x410x410x410x410x410x41,BlockSize为8,后面padding的字节数目为7,填充后为:0x410x410x410x410x410x410x410x410x410x070x070x070x070x070x070x07
- 如果待加密数据长度x恰好是y的整数倍,不在后面多增加y个字节,那么当最后一位为0x01的时候就不知道这是填充的一位还是数据的最后一位
- pkcs5padding:
- 跟pkcs7padding一样,只是BlockSize恒定为8字节(64bit)
- 但是在java中,经过试验,使用AES/CBC/PKCS5Padding和AES/CBC/PKCS7Padding完全一样,估计java的AES/CBC/PKCS5Padding是按照pkcs7协议来的
加密算法性能比较
- 环境:本地 window10 i5-6300U
- 语言:java
- 文本:汉字,length770
- 字符集:utf-8
- 对称加密:循环1000次,一共执行10次,取平均毫秒数
- aes-cbc-128:279
- aes-cbc-256:307
- 非对称加密:循环100次,一共执行10次,取平均毫秒数
- rsa-1024-pri:1705
- rsa-2048-pri:4385
- rsa-1024-pub:88
- rsa-2048-pub:143
- 非对称解密:循环100次,一共执行10次,取平均毫秒数
- rsa-1024-pub:81
- rsa-2048-pub:121
- rsa-1024-pri:1631
- rsa-2048-pri:4256
长求总
- 自己用或服务端内部用的加解密使用AES,秘钥长度推荐256,使用CBC模式,注意padding协议和iv
- 对外使用或对客户端的,如果性能要求不高,使用RSA,秘钥长度可以为1024\2048(推荐2048),注意私钥的pkcs协议
- 对外使用或对客户端的,如果性能要求较高,可以RSA和AES搭配使用。AES使用CBC模式,注意padding协议需一致,iv需随机。RSA秘钥长度可以为1024\2048(推荐2048),注意私钥的pkcs协议
- 2、3两个方案可以被https替换,推荐使用https
网友评论