md5()。vs之间有什么不同。保存密码时哈希?

时间:2016-09-21 09:30:30

标签: php encryption hash

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

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

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

问题是:

我试图向他解释,md5()可以解密,但他接受了:

  

"我可以使用md5(md5(md5('password')))md5() + random string"。

所以,我也提到这个将有很多时间保存到数据库中,当用户登录时,再次进行解密。

但它还不足以说服。有没有人可以建议我如何轻松解释?

感谢。

2 个答案:

答案 0 :(得分:5)

MD5是哈希函数(单向),无法解密,MD5密码存储的问题也不同。

  • MD5对于散列密码来说速度太快,人们可以通过良好的GPU计算出每秒100 Giga MD5。这使得暴力破解太容易了,测试整个英语词典只需几秒钟。
  • 将MD5与md5结合使用(md5(md5('密码')))并没有增加太多安全性,密码破解工具通常会提供开箱即用的功能。

这就是为什么我们应该使用像BCrypt这样的成本因子的哈希函数。成本因素决定了用于计算单个哈希的时间,它应该与服务器可以承受的时间一样多。 PHP提供函数password_hash()来生成安全的密码哈希值。

答案 1 :(得分:0)

  • MD5和SHA是哈希函数(SHA实际上是一系列哈希函数) - 它们获取一段数据,压缩它并创建一个非常难以用不同数据模拟的适当唯一输出。他们不会加密任何东西 - 你不能采用MD5或SHA输出和" unhash"它回到你的起点。两者之间的区别在于它们用于创建哈希的算法。另请注意,MD5现在已被破坏,因为发现了一种容易产生冲突的方法,不再使用或不再信任它。

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