密码加密的方式有:1、利用对称加密算法(例如3DES、AES)进行加密,使用这种方式加密是可以通过解密来还原出原始密码的,当然前提条件是需要获取到密钥;2、使用单向HASH算法(例如MD5、SHA1)进行密码,但无法通过计算还原出原始密码;3、使用特殊的单向HASH算法进行密码;4、使用PBKDF2算法进行加密;5、使用BCrypt算法进行加密;6、用SCrypt算法进行加密。
本教程操作环境:windows7系统、DELL G3电脑
作为一名Web开发人员,我们经常需要与用户的帐号系统打交道,而这其中最大的挑战就是如何保护用户的密码。密码是一个网站系统最重要的护盾,如果把网站系统比作城堡,那密码就是城门。关于如何安全的存储密码以及使用何种算法总是有很多的争论:MD5、SHA1,SHA256、PBKDF2,Bcrypt、Scrypt、Argon2、明文??
常见的7种密码加密方式
我们该采用什么方式来保护用户的密码呢?以下几种方式是常见的密码保存方式:
算法 | 特点 | 有效破解方式 | 破解难度 | 其它 |
---|---|---|---|---|
对称加密 | 可以解密出明文 | 获取密钥 | 中 | 需要确保密钥不泄露 |
单向HASH | 不可解密 | 碰撞、彩虹表 | 中 | |
特殊HASH | 不可解密 | 碰撞、彩虹表 | 中 | 需要确保“盐”不泄露 |
Pbkdf2 | 不可解密 | 无 | 难 | 需要设定合理的参数 |
BCrypt | 不可解密 | 无 | 难 | 需要设定合理的参数 |
SCrypt | 不可解密 | 无 | 难 | 需要设定合理的参数 |
Argon2 | 不可解密 | 无 | 难+ |
1、使用对称加密算法来保存
使用情况: ★★☆☆☆
比如3DES、AES等算法,使用这种方式加密是可以通过解密来还原出原始密码的,当然前提条件是需要获取到密钥。不过既然大量的用户信息已经泄露了,密钥很可能也会泄露,当然可以将一般数据和密钥分开存储、分开管理,但要完全保护好密钥也是一件非常复杂的事情,所以这种方式并不是很好的方式。
对称加密
明文
密文
对称解密
密文
明文
2、使用MD5、SHA1等单向HASH算法保护密码
使用情况: ★★★☆☆
使用这些算法后,无法通过计算还原出原始密码,而且实现比较简单,因此很多互联网公司都采用这种方式保存用户密码,曾经这种方式也是比较安全的方式,但随着彩虹表技术的兴起,可以建立彩虹表进行查表破解,目前这种方式已经很不安全了。
HASH算法
明文
密文
无法还原
密文
明文
3、特殊的单向HASH算法
使用情况: ★★★☆☆
由于单向HASH算法在保护密码方面不再安全,于是有些公司在单向HASH算法基础上进行了加盐、多次HASH等扩展,这些方式可以在一定程度上增加破解难度,对于加了“固定盐”的HASH算法,需要保护“盐”不能泄露,这就会遇到“保护对称密钥”一样的问题,一旦“盐”泄露,根据“盐”重新建立彩虹表可以进行破解,对于多次HASH,也只是增加了破解的时间,并没有本质上的提升。
HASH算法
盐+明文
密文
无法还原
密文
明文
4、PBKDF2
使用情况: ★★★★☆
该算法原理大致相当于在HASH算法基础上增加随机盐,并进行多次HASH运算,随机盐使得彩虹表的建表难度大幅增加,而多次HASH也使得建表和破解的难度都大幅增加。使用PBKDF2算法时,HASH算法一般选用sha1或者sha256,随机盐的长度一般不能少于8字节,HASH次数至少也要1000次,这样安全性才足够高。一次密码验证过程进行1000次HASH运算,对服务器来说可能只需要1ms,但对于破解者来说计算成本增加了1000倍,而至少8字节随机盐,更是把建表难度提升了N个数量级,使得大批量的破解密码几乎不可行,该算法也是美国国家标准与技术研究院推荐使用的算法。
PBKDF2 已经存在很长时间了,像之前文章讨论的一样,它有点过时了:轻松的在多核系统(GPU)上实现并行,这对于定制系统(FPGA/ASIC)来说微不足道。
多次HASH算法
随机盐+明文
密文
无法还原
密文
明文
5、BCrypt
使用情况: ★★★★☆
BCrypt 在1999年就产生了,并且在对抗 GPU/ASIC 方面要优于 PBKDF2,但是我还是不建议你在新系统中使用它,因为它在离线破解的威胁模型分析中表现并不突出。 尽管有一些数字加密货币依赖于它(即:NUD),但它并没有因此获得较大的普及,因此,FPGA/ASIC 社区也并没有足够的兴趣来构建它的硬件实现。 话虽如此,Solar Designer(OpenWall)、Malvoni 和 Knezovic(萨格勒布大学)在 2014 年撰写了一篇论文,这篇文章描述了一种混合使用 ARM/FPGA 的单片系统来攻击该算法。
6、SCrypt
使用情况: ★★★★☆
SCrypt 在如今是一个更好的选择:比 BCrypt设计得更好(尤其是关于内存方面)并且已经在该领域工作了 10 年。另一方面,它也被用于许多加密货币,并且我们有一些硬件(包括 FPGA 和 ASIC)能实现它。 尽管它们专门用于采矿,也可以将其重新用于破解。
7、Argon2
使用情况: ★★★★★
Argon2 基于 AES 实现,现代的 x64 和 ARM 处理器已经在指令集扩展中实现了它,从而大大缩小了普通系统和攻击者系统之间的性能差距,
Argon2 有三个主要的版本:
- Argon2i 是对抗侧信道攻击的最安全选择,Argon2i 使用与数据无关的内存访问,这是密码哈希的首选方法,Argon2i 对内存进行了