在MySQL中使用什么函数来散列密码?

时间:2008-12-03 00:17:25

标签: php mysql hash passwords

我的mysql数据库中有一个用户表,其中包含一个密码列。目前,我使用MD5算法来哈希用户的密码以存储在数据库中。现在我想认为我是一个安全良心的人。我在阅读MySQL文档时注意到他们不推荐使用MD5或SHA / SHA1散列方法,但是没有提供替代方法。

在MySQL中散列我的密码的最佳方法是什么?在我当前的实现中,PHP和MySQL本身都支持的功能是理想的和必要的。

谢谢!

5 个答案:

答案 0 :(得分:11)

不一定你不应该使用MD5,因为你不应该使用只是 MD5,因为这会让你容易受到彩虹表攻击(彩虹表就是一张桌子)预先计算的哈希值 - 如果您的密码甚至是常见的或简单的,攻击者只需要查找哈希值并且他知道您的明文密码。)

至少你应该为每个密码添加一个盐,这样任何现有的彩虹表都是无用的,迫使攻击者为你的密码数据库生成一个全新的彩虹表。

更好的做法是为数据库中的每个密码使用不同的盐,比如它与之关联的用户名,这样攻击者甚至无法为整个数据库生成彩虹表,并且必须单独破解每个条目。 / p>

MD5也是一种非常快速的算法。速度是破解的敌人 - 生成哈希所需的时间越长,黑客每次尝试所需的时间就越长。像登录到您的站点的用户几乎不可察觉(如果有的话)每次使用新的额外盐对明文进行100次扫描这样的简单操作,但是这会增加通过相同的方式强制输入密码所需的时间100次。

这里有更多细节:http://www.codinghorror.com/blog/archives/000953.html

答案 1 :(得分:4)

根据今天的标准,MD5被认为是薄弱的。破解使用MD5制作的哈希仍然需要一些工作,但它比通过暴力猜测密码容易几倍。理想情况下,破解哈希不应该比暴力更容易。

SHA1也被认为比通过蛮力猜测密码更容易破解。

我实际上为MySQL提供了一个补丁来展示OpenSSL中的SHA224,SHA256,SHA384和SHA512功能。 NIST建议使用密码散列(实际上是SHA256及更高版本)。

我的补丁由MySQL工程师完成,如果我记得的话,它包含在MySQL 6.0.5及更高版本中。

如果您使用早期版本的MySQL(以及不使用),那么您可以在宿主语言中使用强哈希函数的实现。例如,PHP具有hash()函数。您可以在应用程序中进行散列并将生成的消息字符串保存到数据库中。

也不要忘记salting

答案 2 :(得分:2)

这个问题是7岁。在那个时候,我们已经在计算方面取得了进步,现在计算机可以轻松打破MD5和SHA1。现在应该避免这些。

在PHP 5.5中引入了password_hash,它使用了更安全的bcrypt算法。虽然MySQL可以加密/解密bcrypt,但它是一个糟糕的解决方案,因为您不仅要向数据库层添加潜在的大量计算负载,而且the unhashed password could be stored in your logs

  

在任何情况下都不应该使用纯文本密码命中MySQL,即使在查询级别也是如此。否则,您可能会将密码写入日志(查询日志,常规日志,慢查询日志等)。哪个是可怕的。所以不,甚至不要打扰......

答案 3 :(得分:1)

由于 know attacks ,可能不再推荐

MD5 SHA-1 。但是,对于大多数用例,它们仍然 通常

如果您正在寻找更多选项,只需使用PHP的hash functions - 那里就有plenty of options

答案 4 :(得分:-3)

我正在使用组合。例如 SHA1(MD5())正常工作。