我的mysql数据库中有一个用户表,其中有一个password列。目前,我使用MD5算法来散列用户的密码,并将其存储在数据库中。现在我喜欢认为我是一个有安全良知的人。在阅读MySQL文档时,我注意到它们不推荐MD5或SHA/SHA1散列方法,但也没有提供替代方法。
在MySQL中散列密码的最佳方法是什么?一个在PHP和MySQL中都被本机支持的函数对于我目前的实现来说将是理想和必要的。
谢谢!
发布于 2008-12-03 00:28:32
这并不是说您不应该使用MD5,而是您不应该只使用MD5,因为这使您容易受到彩虹表攻击(彩虹表是一个预先计算的哈希值的表-如果您的密码很常见或很简单,攻击者只需查看哈希值,他就知道您的明文密码)。
至少,您应该为每个密码添加一个盐,以便任何现有的彩虹表都是无用的,迫使攻击者为您的密码数据库生成一个完整的新彩虹表。
更好的做法是对数据库中的每个密码使用不同的salt,比如与之关联的用户名,这样攻击者甚至不能为整个数据库生成彩虹表,而必须单独破解每个条目。
MD5也是一种非常快的算法。当涉及到破解时,速度是敌人-生成散列花费的时间越长,黑客进行的每次尝试花费的时间就越长。一些简单的事情,比如每次使用新的额外盐对明文进行100次散列,登录到您的站点的用户几乎察觉不到(如果有的话),但它会将暴力破解密码所需的时间增加100倍。
这里有更多详细信息:http://www.codinghorror.com/blog/archives/000953.html
发布于 2008-12-03 00:29:46
按照今天的标准,MD5被认为是很弱的。要破解用MD5生成的散列仍然需要一些工作,但这比用暴力破解密码要容易好几倍。理想情况下,破解哈希不应该比暴力破解更容易。
SHA1也被认为比通过暴力破解密码更容易破解。
实际上,我为MySQL贡献了一个补丁,用于展示来自OpenSSL的SHA224、SHA256、SHA384和SHA512函数。这是NIST推荐用于密码散列(实际上是SHA256或更高版本)的。
我的补丁是由MySQL工程师完成的,如果我还记得的话,它包含在MySQL 6.0.5和更高版本中。
如果您使用较早版本的MySQL (谁不使用),那么您可能可以在您的宿主语言中使用强哈希函数的实现。例如,PHP有hash()函数。您可以在应用程序中进行散列,并将生成的消息字符串保存到数据库。
也不要忘了做salting!
发布于 2016-02-18 05:24:19
这个问题已经有7年的历史了。在那段时间里,我们在计算方面取得了进步,现在MD5和SHA1很容易被现代计算机打破。现在应该避免这些问题。
PHP5.5引入了password_hash,它使用更安全的bcrypt算法。虽然MySQL可以加密/解密bcrypt,但它是一个糟糕的解决方案,因为您不仅会向数据库层添加潜在的大量计算负载,而且还会向the unhashed password could be stored in your logs添加计算负载
在任何情况下都不应使用纯文本密码MySQL,即使是在查询级别也是如此。否则,您可能会将密码写入日志(查询日志、通用日志、慢查询日志等)。这太可怕了。所以不,甚至不用费心...
https://stackoverflow.com/questions/335888
复制相似问题