使用密码保存密码

时间:2014-01-06 18:22:36

标签: passwords password-protection

我正在开发我的第一个需要登录的网络应用程序,而且我必须决定如何存储密码。我一直在做关于散列密码和添加盐的正确方法的大量阅读。在我看来,建议的大多数方法都依赖于使用密码哈希存储在数据库中的一些信息变体,可以是使用全部或部分用户名作为盐或其他随机值的一些变体。

相反,我考虑使用用户自己的密码作为密码的盐。使用算法混淆密码并以某种方式将其添加到自身作为盐。当然,如果攻击者能够访问存储的哈希值和算法的源代码,这将会受到影响,但在这种情况下,任何盐都会受到损害。我的应用程序可能不需要这种级别的安全性,但这只是我在阅读时开始考虑的事情。

我只想从一些更有经验的开发者那里得到一些反馈。任何反馈都表示赞赏。

3 个答案:

答案 0 :(得分:5)

如果您从密码本身中获取盐,您将失去盐腌的全部好处。然后,您可以构建一个rainbow-table来获取所有密码,而相同的密码将产生相等的哈希值。

使用salt的主要原因是,攻击者无法构建一个彩虹表,并获取存储在数据库中的所有密码。这就是为什么你应该为每个密码添加一个随机的唯一盐,然后攻击者必须分别为每个密码建立一个彩虹表。为单个密码构建彩虹表是没有意义的,因为暴力强制更快(为什么不在发现密码时停止)。

不要害怕做得对,通常编程环境支持创建安全哈希并为您处理salting(例如PHP的password_hash())。 salt通常与哈希相结合进行存储,这使得将其存储在单个数据库字段中变得容易。

我写了一篇关于securely storing passwords的小教程,也许你想看看它。

答案 1 :(得分:2)

  1. 简单地复制密码可能仍然容易受到字典攻击,例如密码“hello”变为“hellohello”,因此可能是字典的一部分。
  2. 使用加密密码作为salt,攻击者可以使用字典,然后通过在每个条目上添加scambled密码为所有条目生成彩虹表。
  3. 为什么要更改任何开发人员都能理解的经过验证的算法?只需按默认方式执行,您的代码将由其他任何人维护。
  4. “我的应用程序实际上可能不需要这种级别的安全性” - 直到那个时间点被黑客入侵。使用盐,几乎不需要额外的努力。现在就做。

    “根本不需要存储密码盐”:盐可以非常小(6个字节)。它几乎不会影响性能。

答案 2 :(得分:0)

  

我只想从一些更有经验的开发者那里得到一些反馈。任何反馈都表示赞赏。

OWASP的John Steven对密码存储系统进行了分析,包括威胁模式。它解释了组件及其用途,如哈希,迭代计数,盐,HMAC,HSM等。请参阅Secure Password Storage Cheat SheetSecure Password Storage paper

裂缝并不是唯一的威胁。更有可能的是,那个试图闯入你的组织的人将会使用从Adobe违规,LinkedIn违规,Last.fm违规,eHarmony违规,<最喜欢的>违反....例如:

如果您拥有数千个最受欢迎的密码列表,为什么还要打扰暴力?

因此,第一最佳防御措施是使用过滤用户错误密码选项的单词列表。也就是说,不要让用户首先选择弱密码或已知密码。

如果有人擅离使用您的密码数据库,那么他或她将使用相同的密码列表来尝试猜测您的用户密码。他或她可能甚至不会打扰暴力强迫因为他或她将使用密码列表恢复如此多的密码。

据我了解,这些单词列表在实现为Bloom Filter时非常小。它们的大小只有KB,即使有数百万个密码。请参阅Peter Gutmann的Engineering Security进行深入讨论。