安全算法
# 摘要算法
- 加密过程不需要密钥,并且经过加密的数据无法被解密
- 无论输入的消息有多长,计算出来的消息摘要的长度总是固定的
- 相同的信息求摘要结果相同
# MD5
简介
MD5 的作用是让大容量信息在用数字签名软件签署私人密钥前被 "压缩" 成一种保密的格式 (也就是把一个任意长度的字节串变换成一定长的十六进制数字串)。
特点
- 压缩性:任意长度的数据,算出的 MD5 值长度都是固定的。
- 容易计算:从原数据计算出 MD5 值很容易。
- 抗修改性:对原数据进行任何改动,哪怕只修改 1 个字节,所得到的 MD5 值都有很大区别。
- 强抗碰撞:已知原数据和其 MD5 值,想找到一个具有相同 MD5 值的数据 (即伪造数据) 是非常困难的。
# SHA1
简介
对于长度小于 2^64 位的消息,SHA1 会产生一个 160 位 (40 个字符) 的消息摘要。当接收到消息的时候,这个消息摘要可以用来验证数据的完整性。在传输的过程中,数据很可能会发生变化,那么这时候就会产生不同的消息摘要。
特点
不可以从消息摘要中复原信息;
两个不同的消息不会产生同样的消息摘要,(但会有 1x10 ^ 48 分之一的机率出现相同的消息摘要,一般使用时忽略)。
# 国密 SM3
可以用 MD5 作为对比理解。该算法已公开。校验结果为 256 位。
数字签名
数字签名主要用到了非对称密钥加密技术与数字摘要技术。
数字签名技术是将摘要信息用发送者的私钥加密,与原文一起传送给接收者。接收者只有用发送者的公钥才能解密被加密的摘要信息,然后用 HASH 函数对收到的原文产生一个摘要信息,与解密的摘要信息对比。 如果相同,则说明收到的信息是完整的,在传输过程中没有被修改,否则说明信息被修改过.
因此数字签名能够验证信息的完整性。 数字签名是个加密的过程,数字签名验证是个解密的过程。
# 对称加密算法
加密密钥和解密密钥相同的加密算法
# DES (opens new window)
DES 全称为 Data Encryption Standard,即数据加密标准,是一种使用密钥加密的块算法,现在已经过时。
DES 加密算法出自 IBM 的研究,后来被美国政府正式采用,之后开始广泛流传,但是近些年使用越来越少,因为 DES 使用 56 位密钥,以现代计算能力,24 小时内即可被破解。虽然如此,在某些简单应用中,我们还是可以使用 DES 加密算法,注意: DES 加密和解密过程中,密钥长度都必须是 8 的倍数。
# IDEA (opens new window)
这种算法是在 DES 算法的基础上发展出来的,类似于三重 DES。
发展 IDEA 也是因为感到 DES 具有密钥太短等缺点。
IDEA 的密钥为 128 位,这么长的密钥在今后若干年内应该是安全的。
在实际项目中用到的很少,了解即可。
# 国密 SM1
加密强度与 AES 相当。该算法不公开,调用该算法时,需要通过加密芯片的接口进行调用。
# 国密 SM4
Hutool 国密算法工具 - SmUtil (opens new window) 使用 SM4 作为国密对称加密算法
此算法是一个分组算法,用于无线局域网产品。该算法的分组长度为 128 比特,密钥长度为 128 比特。加密算法与密钥扩展算法都采用 32 轮非线性迭代结构。解密算法与加密算法的结构相同,只是轮密钥的使用顺序相反,解密轮密钥是加密轮密钥的逆序。
# 非对称加密算法
与对称加密算法不同,非对称加密算法需要两个密钥:公开密钥 (publickey) 和私有密钥 (privatekey)。
公开密钥与私有密钥是一对,如果用公开密钥对数据进行加密,只有用对应的私有密钥才能解密;
如果用私有密钥对数据进行加密,那么只有用对应的公开密钥才能解密。
因为加密和解密使用的是两个不同的密钥,所以这种算法叫作非对称加密算法。
# RSA
RSA 是目前最有影响力和最常用的公钥加密算法。它能够抵抗到目前为止已知的绝大多数密码攻击,已被 ISO 推荐为公钥数据加密标准。
# 国密 SM2
基于 ECC。该算法已公开。由于该算法基于 ECC,故其签名速度与秘钥生成速度都快于 RSA。ECC 256 位(SM2 采用的就是 ECC 256 位的一种)安全强度比 RSA 2048 位高,但运算速度快于 RSA。
SM2 椭圆曲线公钥密码算法是我国自主设计的公钥密码算法,包括 SM2-1 椭圆曲线数字签名算法,SM2-2 椭圆曲线密钥交换协议,SM2-3 椭圆曲线公钥加密算法,分别用于实现数字签名密钥协商和数据加密等功能。SM2 算法与 RSA 算法不同的是,SM2 算法是基于椭圆曲线上点群离散对数难题,相对于 RSA 算法,256 位的 SM2 密码强度已经比 2048 位的 RSA 密码强度要高。
SM2 公钥加密算法比 RSA 相对复杂,加密结果由 3 个部分组成,SM2 加密过程中使用了随机数,因此同样的明文数据每一次加密结果都不一样。但是这并不能防御重放攻击,如果要防御重放攻击,需要服务端提供加密因子,通过 SM2SM4 混合算法来抵御重放攻击。