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

2022-08-31 00:41:54

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

忽略了PHP本身的局限性,我想知道更多关于腌制,散列和加密这些坏男孩的信息。

显然,除非被迫这样做,否则人们将继续使用弱密码,但对我来说重要的是我如何存储它们。对我来说,我用户的密码远比数据库本身重要得多,因此我想以这样一种方式保留它们,即对于任何尝试反向的脚本小子来说,这将是艰苦而单调的。显然,通过尽职调查,几乎任何事情都可以被击败,但我不介意让这变得特别麻烦。

我们正在研究两种情况。

  1. 孩子有数据库的完整副本。
  2. 这个孩子有一个完整的PHP副本,用于制作密码和数据库。

关于这个主题的任何和所有建议都受到亲切的赞赏。


答案 1

使用 bcrypt。如果有人拥有您数据库的用户表,那么他们可以使用蛮力/彩虹表/等来满足他们的需求。即使使用盐,如果您使用的是MD5或其他一些快速哈希算法(顺便说一句,这些算法不是为解决此问题而设计的);它被破解只是时间问题。

任何众所周知且广泛支持的哈希算法都会有相同的基本“缺陷”(如果你可以这样称呼它;它实际上是根据定义)。不同之处在于,在执行哈希操作时,糖蜜的速度很慢,使蛮力攻击的效果要差得多。bcrypt

有关 优点的绝对伟大的讨论 ,其他方法的危险性以及密码安全性的难度,请阅读此线程。它有很多人的评论,他们对这种事情比我更了解,它应该有希望帮助你理解更多的利害关系问题。bcrypt


答案 2

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

  • 用户名(纯文本)
  • (随机字符串)
  • 盐渍哈希sha1(用户名 + 盐 + 密码))

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

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

即使使用源代码,攻击者也无法获得密码,因为强度/安全性在于哈希算法,而不是您的代码。

根据Donut的答案,将其与使用bcrypt相结合,您真的非常安全。那是:

  • 用户名(纯文本)
  • (随机字符串)
  • Salted Hashbcrypt(用户名 + salt + password))

推荐