使用PhP加密存储在MySql中的密码的最佳做法是什么?

16 php mysql security passwords

我正在寻求有关如何使用PHP在MySQL中安全存储密码的建议.

忽略了PHP本身的局限性,我想了解更多关于盐水,散列和加密这些坏男孩的信息.

显然人们将继续使用弱密码,除非被迫做其他事情,但这就是我存储它们对我来说很重要的方式.我的用户密码对我来说比数据库本身更重要,因此我希望以这样的方式保留它们,这对任何试图反向的脚本小子都是徒劳和单调的.显然,尽职尽责,任何事都可以被打败,但我不介意让这件事特别麻烦.

我们正在研究两种情况.

  1. 小子有一份完整的数据库副本.
  2. 小家伙拥有用于制作密码的PHP的完整副本和数据库.

关于这个主题的任何和所有建议都得到了慷慨的赞赏.

Don*_*nut 17

使用bcrypt.如果有人拥有数据库的用户表,那么他们可以使用暴力/彩虹表/等来表达他们内心的内容.即使使用salt,如果您正在使用MD5或其他一些快速哈希算法(顺便说一句,这些算法并不是为解决这个问题而设计的); 它可以被破解只是时间问题.

任何众所周知且广泛支持的散列算法都将具有相同的基本"缺陷"(如果你可以称之为它;它实际上就是定义).不同之处在于,当执行散列操作时,糖蜜bcrypt,使得暴力攻击效率降低得多.

有关bcrypt其他方法的优点,以及一般密码安全的难度的绝对讨论,请阅读此主题.它有很多人的评论,比我更了解这类事情,它应该有助于你理解更多的问题.


Mat*_*hew 8

假设您使用用户名和密码作为身份验证令牌,您可以安全地存储以下内容以确保数据不会受到损害.

  • 用户名(以明文形式)
  • (随机串)
  • 盐渍哈希(sha1(用户名+盐+密码))

使用该方案,攻击者不能对您使用彩虹表,并且密码不能通过任何(合理的)方式恢复.(也就是说,只要你的攻击者不是政府)

即使攻击者有盐和哈希对,也不可能使用彩虹表,因为无论如何都需要计算所有可能的哈希值,使用他们已经给出的盐,所以这对每个用户来说都是一个全新的暴力攻击.

即使源代码和攻击者也无法获取密码,因为强度/安全性是在哈希算法中,而不是您的代码.

根据Donut的回答,结合使用bcrypt,你真的很安全.那是:

  • 用户名(以明文形式)
  • (随机串)
  • 盐渍哈希(bcrypt(用户名+盐+密码))