md5() .vs. md5有什么不同?保存密码时散列


What different between md5() .vs. hash when saving password?

今天,我和朋友讨论了一个网站的安全问题。

在保存用户密码时,我通常使用随机盐的哈希。

由于哈希不能反编译,我的朋友经常使用md5()加密用户的密码。

问题是:

我试着向他解释,md5()可以解密,但他拿走了:

" I can use md5(md5(md5('password'))) or md5() + random string ".

所以,我还要提一下这样会有很多时间保存到数据库中,当用户登录时,再进行解密。

但这也不足以说服。有没有人能建议我如何解释得通俗易懂?

谢谢。

MD5是一个散列函数(单向),不能解密,MD5用于密码存储的问题是不同的。

  • MD5对于散列密码来说速度太快了,一个好的GPU每秒可以计算100千兆的MD5。这使得暴力破解变得太容易了,测试整个英语词典只是微秒的事。
  • 组合MD5 (MD5 (MD5 ('password')))不会增加太多的安全性,密码破解工具通常提供这个开箱即用。

这就是为什么我们应该使用带有成本因子的哈希函数,比如BCrypt。成本因素决定了计算单个哈希值所花费的时间,它应该是您的服务器所能承受的。PHP提供了password_hash()函数来生成安全的密码哈希。

  • MD5和SHA是哈希函数(SHA实际上是一个哈希函数族)——它们取一段数据,压缩它并创建一个合适的唯一输出,这是很难用不同的数据来模拟的。它们不加密任何东西——你不能接受MD5或SHA输出并"解列"它以回到你的起点。两者之间的区别在于它们使用哪种算法来创建哈希。另外请注意,MD5现在被破坏了,因为发现了一种容易产生冲突的方法,不应该再使用或信任。

  • RSA是一种非对称加密算法。您有两个密钥(私有和公共),您可以使用一个密钥执行一个功能(加密或解密),并使用另一个密钥进行反转。使用哪个密钥取决于您是尝试进行数字签名还是加密。