如何*正确*存储密码?
-
06-07-2019 - |
解决方案
你做对了。只有两个建议:
如果有一天 SHA1 变得太弱并且您想使用其他密码,则不可能对旧密码进行散列处理并使用新方案重新散列它们。出于这个原因,我建议为每个密码附加一个“版本”号,告诉您使用的方案(盐长度、哈希值、次数)。如果有一天您需要从 SHA 切换到更强大的密码,您可以创建新式密码,同时数据库中仍保留旧式密码,并且仍然可以区分它们。将用户迁移到新方案将会更加容易。
密码仍然在不加密的情况下从用户传输到系统。看着 建议零售价 如果这是一个问题。SRP 太新了,您应该对实施它有点偏执,但到目前为止它看起来很有希望。
编辑:事实证明,bcrypt 在第 1 个想法上比我先一步。存储的信息是(成本、盐、哈希),其中成本是哈希已完成的次数。看起来 bcrypt 做了正确的事情。无需用户干预即可增加散列次数。
其他提示
事实上,这取决于密码的用途。您应该谨慎存储任何密码,但有时需要比其他人更加小心。作为一般规则,所有密码都应进行哈希处理,并且每个密码应具有唯一的盐。
事实上,盐不需要那么复杂,即使是很小的盐也会给试图进入系统的黑客带来真正的噩梦。它们被添加到密码中以防止使用 Rainbow 表破解多个帐户的密码。我不会在密码中添加单个字母并将其称为盐,但您也不需要将其设置为在数据库中其他位置加密的唯一 guid。
关于盐的另一件事。在散列时使密码+盐起作用的关键是两者组合的复杂性。如果您有一个 12 个字符的密码,并向其中添加一个 1 个字符的盐,盐的作用并不大,但破解密码仍然是一项巨大的壮举。反之亦然。
使用:
- 哈希密码存储
- 128+ 位用户级盐,随机,重新生成(即当您创建新的密码哈希时,您会创建新的盐,您不会为给定用户持续保留相同的盐)
- 一种强大的、计算成本高昂的哈希方法
- 方法有些不同(哈希算法、使用多少次哈希迭代、盐的连接顺序、 某物)来自任何像这样的“标准实施指南”以及您编写的任何其他密码存储实施
我认为所需的密码没有额外的迭代,Juste请确保有盐和复杂的密码;)我的人使用SHA-1与2个盐键形词相结合。
盐的长度并不重要,只要它对于用户来说是唯一的即可。使用盐的原因是,给定的哈希匹配生成尝试仅对数据库中用户表的单行有用。
简单地说,使用加密安全哈希算法和一些密码盐,这对于 99.99% 的所有用例来说应该足够了。薄弱环节是检查密码以及密码输入的代码。