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


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

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

谢谢!


870
2017-12-03 00:17


起源



答案:


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

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

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

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

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


11
2017-12-03 00:28





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

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

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

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

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

别忘了做 也是!


4
2017-12-03 00:29





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

随着PHP 5.5的推出 password_hash,它使用更安全的bcrypt算法。虽然MySQL可以加密/解密bcrypt,但这是一个糟糕的解决方案,因为你不仅要向数据库层添加一个潜在的大型计算负载, 未映射的密码可以存储在您的日志中

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


2
2018-02-17 21:24





MD5 和 SHA-1 可能不再推荐了 知道攻击。但是,它们仍然存在 通常 足以满足大多数用例。

如果您正在寻找更多选项,请使用PHP 哈希函数  - 你有 有很多选择 那里。


1
2017-12-03 00:26





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


-3
2018-02-17 10:20



这真的不那么安全。虽然组合哈希更加安全,但破坏SHA1的成本正在迅速达到破解的微不足道的程度。 MD5已经存在。 - Machavity
我认为SHA1(MD5(密码(SHA1(MD5('lalala')))))是安全的。 - Björn Schönrock
请阅读: gist.github.com/MadaraUchiha/041a886e1bf27da5373c (剧透警报, SHA1(MD5( 不如安全 SHA1() - Madara Uchiha♦
不是说我同意Bjorn,但你所关联的与他建议的方法完全不同。重新检查您提供的URL处的代码,以查看它们是指的 myHash 功能只有两个可能的结果;) - Mavelo


答案:


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

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

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

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

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


11
2017-12-03 00:28





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

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

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

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

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

别忘了做 也是!


4
2017-12-03 00:29





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

随着PHP 5.5的推出 password_hash,它使用更安全的bcrypt算法。虽然MySQL可以加密/解密bcrypt,但这是一个糟糕的解决方案,因为你不仅要向数据库层添加一个潜在的大型计算负载, 未映射的密码可以存储在您的日志中

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


2
2018-02-17 21:24





MD5 和 SHA-1 可能不再推荐了 知道攻击。但是,它们仍然存在 通常 足以满足大多数用例。

如果您正在寻找更多选项,请使用PHP 哈希函数  - 你有 有很多选择 那里。


1
2017-12-03 00:26





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


-3
2018-02-17 10:20



这真的不那么安全。虽然组合哈希更加安全,但破坏SHA1的成本正在迅速达到破解的微不足道的程度。 MD5已经存在。 - Machavity
我认为SHA1(MD5(密码(SHA1(MD5('lalala')))))是安全的。 - Björn Schönrock
请阅读: gist.github.com/MadaraUchiha/041a886e1bf27da5373c (剧透警报, SHA1(MD5( 不如安全 SHA1() - Madara Uchiha♦
不是说我同意Bjorn,但你所关联的与他建议的方法完全不同。重新检查您提供的URL处的代码,以查看它们是指的 myHash 功能只有两个可能的结果;) - Mavelo