今天,我和朋友讨论了一个网站的安全问题。
在保存用户密码时,我通常使用随机盐的哈希。
由于哈希不能反编译,我的朋友经常使用md5()
加密用户的密码。
问题是:
我试着向他解释,md5()可以解密,但他拿走了:
" I can use
md5(md5(md5('password')))
ormd5() + random string
".
所以,我还要提一下这样会有很多时间保存到数据库中,当用户登录时,再进行解密。
但这也不足以说服。有没有人能建议我如何解释得通俗易懂?
谢谢。
MD5是一个散列函数(单向),不能解密,MD5用于密码存储的问题是不同的。
- MD5对于散列密码来说速度太快了,一个好的GPU每秒可以计算100千兆的MD5。这使得暴力破解变得太容易了,测试整个英语词典只是微秒的事。
- 组合MD5 (MD5 (MD5 ('password')))不会增加太多的安全性,密码破解工具通常提供这个开箱即用。
这就是为什么我们应该使用带有成本因子的哈希函数,比如BCrypt。成本因素决定了计算单个哈希值所花费的时间,它应该是您的服务器所能承受的。PHP提供了password_hash()函数来生成安全的密码哈希。
-
MD5和SHA是哈希函数(SHA实际上是一个哈希函数族)——它们取一段数据,压缩它并创建一个合适的唯一输出,这是很难用不同的数据来模拟的。它们不加密任何东西——你不能接受MD5或SHA输出并"解列"它以回到你的起点。两者之间的区别在于它们使用哪种算法来创建哈希。另外请注意,MD5现在被破坏了,因为发现了一种容易产生冲突的方法,不应该再使用或信任。
-
RSA是一种非对称加密算法。您有两个密钥(私有和公共),您可以使用一个密钥执行一个功能(加密或解密),并使用另一个密钥进行反转。使用哪个密钥取决于您是尝试进行数字签名还是加密。