在后端应用中,总有一个绕不开的话题,那就是怎么存储用户的密码。用户密码的传输和存储对于数据安全来说都很重要。那么,我们要怎么管理用户的密码呢?我们先从用户密码的存储上说起。
用户密码的存储
直接存储
在数据库中保存用户密码最简单、最直接的方法就是直接存储密码。比如用户的密码是123456,在数据库中就直接存储123456。这种方法虽然简单直接,但却是最不安全的方法。一旦数据库泄漏,那么用户的密码就会直接泄漏。
对称加密
既然直接存储密码不够安全,那么我们就可以把密码加密之后再进行存储。加密的方式有对称加密和非对称加密。在许多的应用中,会使用DES,AES等对称加密算法对密码进行加密之后再进行存储。这样的做法在一定程度上提高了密码的安全性。对称加密算法中好处是,可以使用对称加密算法还原出原来的密码(前提是知道加密算法的密钥)。但一旦,密钥泄漏,那么密码也就不再安全,所以,安全的存储密钥成了保证对称加密算法安全的一个挑战。
非对称加密
在非对称加密中,我们可以使用MD5,SHA1这样的非对称加密算法来加强密码的安全性。但这样的算法也不是绝对安全的,对于这样的非对称加密,可以使用彩虹表的方式来破解。使用了加盐算法的非对称加密算法,虽然在一定程度上也加强的密码的安全性。但是,如果盐被泄漏之后,还是可以使用彩虹表的破解的。对于多次使用HASH算法的计算来加密的破解方法就是在破解的过程中也多几次HASH运算。
PBKDF2算法
PBKDF2算法想比较而言是相对安全的算法,因为PBKDF2在原理是就是使用随机盐的非对称加密的多次运算,这在安全性上得到了大大的提升。
bcrypt、scrypt等算法
这两种算法也可以有效抵御彩虹表,使用这两种算法时也需要指定相应的参数,使破解难度增加。
用户密码不同存储的比较:
| 算法 | 特点 | 有效破解方式 | 破解难度 | 其它 |
|---|---|---|---|---|
| 明文存储 | 简单直接 | 无需破解 | 无 | |
| 对称加密 | 可以直接解密出明文 | 获取密钥 | 中 | 需要保证密钥的安全 |
| 单向HASH | 不可破解 | 碰撞、彩虹表 | 中 | |
| 特殊HASH | 不可破解 | 碰撞、彩虹表 | 中 | 需要保证盐的安全 |
| Pbkdf2 | 不可破解 | 无 | 难 | 设置合理参数 |
