转自:
https://juejin.cn/post/6916150628955717646
在介绍具体方案之前,首先先介绍一下常见的加密算法。
- 对称加密算法
- 非对称加密算法
- Hash 算法
对称加密算法
加密和解密使用的是相同的密钥。对称加密算法的加解密速度快,但安全性较差。
常见的对称加密算法:DES、3DES、DESX、Blowfish、IDEA、RC4、RC5、RC6 和 AES。
非对称加密算法
加密和解密使用的是不同的密钥,也称为公私钥加密。非对称加密的缺点是加解密速度要远远慢于对称加密,在某些极端的情况下,甚至能比非对称加密慢上 1000 倍。但安全性比对称加密算法高。
常见的非对称加密算法:RSA、ECC(移动设备用)、Diffie-Hellman、El Gamal、DSA(数字签名用)。
Hash 算法
Hash 算法的特别之处在于它是一种单向算法,用户可以通过 Hash 算法对目标信息生成一段特定长度的唯一的 Hash 值,却不能通过这个 Hash 值重新获得目标信息。Hash 算法常用在不可还原的密码存储、信息完整性校验等场景。
常见的 Hash 算法:MD2、MD4、MD5、HAVAL、SHA、SHA-1、HMAC、HMAC-MD5、HMAC-SHA1。
用户管理模块中但凡涉及到密码的地方都需要进行加密处理。
admin 账户激活
平台默认包含一个 admin 账号,admin 账号在初次使用时都需要激活密码,调用激活接口时,前端传输给后端的密码需要进行加密。
用户登陆
激活完成后,admin 账号才可以进行登陆,调用登陆接口时,如果不对密码进行加密,明文传输会被不法分子利用,导致数据泄露等安全问题。
用户创建
admin 账号创建普通用户时,需要给普通用户设置初始密码,因此调用用户创建接口时,前端传输给后端的数据需要进行加密处理。
用户信息修改
用户信息修改时可以修改密码,因此调用修改用户信息接口时,前端将数据传输给后端时需要进行加密处理。
数据入库
admin 账号创建普通用户时,会给普通用户设置初始密码,这部分数据都是保存在数据库中的,admin 账户激活时的密码也是保存在数据库中的。但是数据库也存在被攻击的可能性,有可能会导致用户数据被盗,因此对入库的数据中安全级别较高的字段需要进行加密处理,这里很明显用户的密码是需要进行加密后再入库的。
如何选择加密算法实现加密功能?
admin 账号激活
admin 账号必须对密码进行解密,所以只可以选择对称加密和非对称加密算法。因此 admin 账号激活采用 RSA 加密算法和 AES128 加密算法,由 Web 端管理公钥和私钥。
- Web 端发送 base64 编码后的 RSA 加密算法生成的公钥
- Server 端 base64 解码公钥
- Server 端随机生成一个 16 位的随机字符串
- Server 端使用公钥对生成的随机字符串进行加密
- Server 端将加密后的随机字符串再进行 base64 编码,并发送给 Web 端
- Web 端 base64 解码随机字符串
- Web 端对 base64 解码后的字符串再使用私钥解码
- Web 端将密码拼接为新的字符串,新的字符串为随机字符串 + 密码
- Web 端将随机字符串作为 AES 加密算法的密码对密码进行加密,并发送给 Server 端
- Server 端使用随机字符串对新的字符串进行解密
- Server 端解析解密后的字符串,校验随机字符串是否一致
- Server 端解析出字符串中的密码,并对密码进行加密入库
数据入库加密的密钥和对随机字符串加密的密钥是不相同的。
由 Server 端管理公钥和私钥,Web 端获取公钥并对密码加密,并发送给 Server 端,Server 端再使用私钥解密密码,这样也没毛病。
小心中间人攻击
什么是中间人攻击?
中间人攻击(Man-in-the-MiddleAttack,简称“MITM 攻击”)是指攻击者与通讯的两端分别创建独立的联系,并交换其所收到的数据,使通讯的两端认为它们正在通过一个私密的连接与对方直接对话,但是事实上整个会话都已经被攻击者完全控制了。
在中间人攻击中,攻击者可以拦截通讯双方的通话,并插入新的内容。中间人攻击是一个缺乏相互认证的攻击。大多数的加密协议都专门加入了一些特殊的认证方法以阻止中间人攻击。例如,SSL 协议可以验证参与通讯的一方或双方所使用的证书是否是由权威的受信任的数字证书认证机构颁发,并且能执行双向身份认证。
中间人攻击过程如下。
- 客户端发送请求到服务端,请求被中间人截获
- 服务器向客户端发送公钥
- 中间人截获公钥,保留在自己手上。然后自己生成一个伪造的公钥发给客户端
- 客户端收到伪造的公钥后,生成加密 Hash 值发给服务器
- 中间人获得加密 Hash 值,用自己的私钥解密获得真秘钥。同时生成假的加密 Hash 值,发给服务器
- 服务器用私钥解密获得假密钥。然后加密数据传输给客户端
如果直接发送公钥给 Web 端,就很容易被中间人攻击,导致数据泄露。
用户登陆
用户登陆时,对密码进行校验是可以不需要进行解密的,因此用户登陆选择的是 Hash 算法中的 MD5 加密算法,虽然 MD5 是可以被破解的,但是为了能够和其他部门进行对接,只能选择 MD5 加密算法。
- 前端 MD5 加密密码
- 服务端查询指定用户的密码
- 将数据库查询到的密码用私钥进行解密
- 将解密后的密码进行 MD5 加密,并和前端传入的密码进行比对
用户创建 & 用户信息修改
使用 AES128 加密算法,和激活使用的公钥相同。
数据入库
使用 AES128 加密算法,和激活所使用的公钥不为同一个。