一个 文章 我在这里偶然发现的 SO 提供了链接 其他文章 这反过来又提供了链接 文章 ETC。

最后我完全被难住了 - 那么什么是 最好的 在数据库中存储密码的方法?据我所知,你应该:

  • 使用长盐(至少 128 个完全随机位),以明文形式存储在密码旁边;
  • 对加盐密码使用 SHA-256(或什至更高 SHA 级别)的多次迭代。

但...我对密码学了解得越多,我就越明白我其实什么都不懂,多年来我一直认为正确的事情实际上是完全错误的。这里有这方面的专家吗?

添加: 看来有些人没有抓住重点。我重复上面给出的最后一个链接。这应该可以澄清我的担忧。

https://www.nccgroup.trust/us/about-us/newsroom-and-events/blog/2007/july/enough-with-the-rainbow-tables-what-you-need-to-know-about-安全密码方案/

有帮助吗?

解决方案

你做对了。只有两个建议:

  1. 如果有一天 SHA1 变得太弱并且您想使用其他密码,则不可能对旧密码进行散列处理并使用新方案重新散列它们。出于这个原因,我建议为每个密码附加一个“版本”号,告诉您使用的方案(盐长度、哈希值、次数)。如果有一天您需要从 SHA 切换到更强大的密码,您可以创建新式密码,同时数据库中仍保留旧式密码,并且仍然可以区分它们。将用户迁移到新方案将会更加容易。

  2. 密码仍然在不加密的情况下从用户传输到系统。看着 建议零售价 如果这是一个问题。SRP 太新了,您应该对实施它有点偏执,但到目前为止它看起来很有希望。

编辑:事实证明,bcrypt 在第 1 个想法上比我先一步。存储的信息是(成本、盐、哈希),其中成本是哈希已完成的次数。看起来 bcrypt 做了正确的事情。无需用户干预即可增加散列次数。

其他提示

事实上,这取决于密码的用途。您应该谨慎存储任何密码,但有时需要比其他人更加小心。作为一般规则,所有密码都应进行哈希处理,并且每个密码应具有唯一的盐。

事实上,盐不需要那么复杂,即使是很小的盐也会给试图进入系统的黑客带来真正的噩梦。它们被添加到密码中以防止使用 Rainbow 表破解多个帐户的密码。我不会在密码中添加单个字母并将其称为盐,但您也不需要将其设置为在数据库中其他位置加密的唯一 guid。

关于盐的另一件事。在散列时使密码+盐起作用的关键是两者组合的复杂性。如果您有一个 12 个字符的密码,并向其中添加一个 1 个字符的盐,盐的作用并不大,但破解密码仍然是一项巨大的壮举。反之亦然。

使用:

  1. 哈希密码存储
  2. 128+ 位用户级盐,随机,重新生成(即当您创建新的密码哈希时,您会创建新的盐,您不会为给定用户持续保留相同的盐)
  3. 一种强大的、计算成本高昂的哈希方法
  4. 方法有些不同(哈希算法、使用多少次哈希迭代、盐的连接顺序、 某物)来自任何像这样的“标准实施指南”以及您编写的任何其他密码存储实施

我认为所需的密码没有额外的迭代,Juste请确保有盐和复杂的密码;)我的人使用SHA-1与2个盐键形词相结合。

盐的长度并不重要,只要它对于用户来说是唯一的即可。使用盐的原因是,给定的哈希匹配生成尝试仅对数据库中用户表的单行有用。

简单地说,使用加密安全哈希算法和一些密码盐,这对于 99.99% 的所有用例来说应该足够了。薄弱环节是检查密码以及密码输入的代码。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top