常见的加解密算法可以分为可逆和不可逆两种
不可逆算法
哈希算法,MD5,hs-256,SM3
一般系统中使用密码加密和数据防篡改校验字段就是不可逆算法
hs-256应用:JWT
header头部+payload荷载+signature签名(防止篡改)
前两部分采用base64进行编码,签名使用hs256进行加密
头部(Header)
{"typ":"JWT","alg":"HS256"}
在头部指明了签名算法是 HS256 算法。
经过 Base64 编码得到:eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9(第一部分)
载荷(playload)
载荷就是存放有效信息的地方。
{
"sub": "1234567890",
"name": "John Doe",
"admin": true
}
然后对有效负载进行 Base64Url 编码以形成 JSON Web 令牌的第二部分eyJpZCI6IjEyMzQ1NiIsIm5hbWUiOiJNb29ubGlnaHRMIiwic2V4IjoibWFsZSJ9(第二部分)。
请注意,对于签名令牌,此信息虽然受到篡改保护,但任何人都可以读取。不要将机密信息放在 JWT 的有效负载或标头元素中,除非它已加密。
签证(signature)
jwt的第三部分是一个签证信息。这个部分需要 Base64 加密后的 header 和 Base64 加密后的 payload 使用 “.” 连接组成的字符串,然后通过 header 中声明的加密方式进行加盐 secret 组合加密,然后就构成了 jwt 的第三部分。
即将 eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI6IjEyMzQ1NiIsIm5hbWUiOiJNb29ubGlnaHRMIiwic2V4IjoibWFsZSJ9 进行 HS256 算法加密(header 定义的)得到:
e5dda3f17226c1c6ca7435cd17f83ec0c74d62bd8e8386e1a178cd970737f09f(第三部分)。
最后,我们将上述的 3 个部分的字符串通过 “.” 进行拼接得到 JWT:
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI6IjEyMzQ1NiIsIm5hbWUiOiJNb29ubGlnaHRMIiwic2V4IjoibWFsZSJ9.e5dda3f17226c1c6ca7435cd17f83ec0c74d62bd8e8386e1a178cd970737f09f 。
在实际开发中,用户登录成功后,后端生成 jwt 返回给前端,之后,前端与后端交互时携带 jwt 让后端验证 jwt 的合法性。
可逆算法
对称加密
DES、3DES、AES(主流),SM1,SM4
适用于无需进行密钥交换的场景
1如内部系统,事先就可以直接确定密钥
2.防止明文传输数据被窃取的
3.加解密速度快,适合数据内容比较大的加密场景
非对称加密
RSA、DSA、SM2
适用于需要密钥交换的场景
如互联网应用,无法事先约定密钥,这时与对称加密算法结合。利用非对称加密算法安全性较好的特点,传递对称加密算法的密钥。利用对称加密算法加解密速度快的特点,进行数据内容比较大的加密场景的加密。如HTTPS。
应用:数字签名,数字证书,ssl
国密算法应用
基本上SM2、SM3、SM4都会同时使用。一般都是用SM4对数据内容加密,使用SM3,对内容进行摘要,再使用SM2,对摘要进行签名。这个是数据发送端做的事情。接收端,先用SM2,对摘要进行验签,验签成功后,就做到了防抵赖(验证对方身份和数据的真实性),对发送过来的内容进行SM3摘要,看下生成的摘要和验签后的摘要是否一致,用于防篡改。SM4对称加密比较快