2016-09-21 138 views
2

今天,我和我的朋友讨论了一个网站的安全问题。md5().vs之间有什么不同。散列时保存密码?

我通常在保存用户密码时使用随机盐的散列。

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

问题是:

我试图向他解释,MD5()可以解密,但他拿:

“我可以用md5(md5(md5('password')))md5() + random string”。

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

但它也不足以说服。有谁可以建议我如何解释容易理解?

谢谢。

+1

看看这里http://security.stackexchange.com/questions/2298/what-are-the-differences-between-md5-sha-and-rsa –

+0

看起来不错。在创建这个问题之前,我没有找到它。非常感谢@DCoder。 – vanloc

回答

4

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

  • MD5方式是太快了散列密码,就可以计算出约100千兆MD5每秒具有良好的GPU。这使得暴力破解过于简单,测试整个英文字典只需要几秒钟的时间。
  • MD5与md5(md5(md5('password')))结合不会提高安全性,密码破解工具经常提供这种开箱即用的功能。

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

+0

你说'md5()'太快了。你认为使用它来保存密码?函数'password_hash()'是'md5()'的最佳解决方案? – vanloc

+0

'md5'无法解密?但我不知道这一行:'这使得暴力行为变得过于简单,测试整个英文字典只需要几秒钟的时间。“它的意思是? 'md5'可以解密? – vanloc

+0

是的MD5最糟糕的问题是它的牢固性。函数password_hash()是最好的选择,它是未来的证明(所使用的算法可以交换)并且它以本地代码实现。暴力破解不是解密,你可以找到导致相同散列的textes,但你永远无法确定它是否是原始密码,有无数个匹配的textes。 – martinstoeckli

0
  • MD5和SHA散列函数(SHA实际上是散列函数的家庭) - 它们取一块数据的,紧凑的,并创建适当唯一的输出,这是非常难以与不同片的模拟数据。他们不加密任何东西 - 你不能采取MD5或SHA输出,并“解开”它以回到起点。两者之间的区别在于他们使用什么算法来创建哈希。另外请注意,MD5现在已经被破解,因为发现了一种轻松产生冲突的方式,不应该再使用也不可信任。

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

+0

感谢您的回答。 RSA可以使用解密,但它有一个时间取决于像64位 - 128位 - 256位的类别。 – vanloc