数据库储存密码 md5+盐
太多时候,系统被黑客入侵,其用户数据库也遭到破坏。 尽管有足够的资源来正确存储用户凭据,但在很多情况下,数据库包含纯文本密码 , 哈希值低的密码或双向加密的密码 。 不仅是遗留数据库; 就在本周,我看到了一个Reddit线程 ,至少有一个开发人员倡导自定义哈希函数和“默默无闻的安全性”。
尽管密码学是一门复杂的学科,但您无需成为专家即可成为用户凭据的良好管家。 选择方案时,请遵循以下简单规则: 1
- 使用经过安全专家公开审查的,经过验证的单向哈希算法,例如bcrypt , PBKDF2或scrypt 。
- 不要尝试编写自己的哈希算法。 您不能依靠“默默无闻的安全性”; 您必须假设攻击者拥有您的源代码,并且可以攻击您的劣等算法。 2
- 我是说真的,不要编写您自己的哈希算法! 只需使用规则1中的一项即可。 它们是免费的,几乎可以在任何平台上使用,并且已经由安全方面的最佳专家证明是安全的。
- 说真的,你为什么还读这个? 规则1是您所需要的!
- 好吧,如果您真的要忽略规则1,请至少通知您的用户您没有安全地存储他们的密码,并且如果数据库被破坏,他们的密码将成为公共知识。
我不想处理绝对问题,特别是在软件开发方面,但是我对此确实感到很强烈。 在任何情况下都不应该开发自己的密码哈希算法! 3这是在Java中使用PBKDF2而不导入任何外部库的示例; 如果您使用Node.js,那么有一个用于bcrypt的模块 ; 有一个用于scrypt的Ruby宝石 ; 甚至PHP也有使用bcrypt的内置密码哈希函数 。 实际上,几乎所有语言都可以免费使用这三种算法中的任何一种库。 只是Google“ 您的选择语言bcrypt或scrypt OR pbkdf2 ”,您会发现很多选择。
几乎可以肯定,没有经过严格的公开同行评审的任何哈希函数都没有正确设计。 如果Niels Provos自己(bcrypt的创建者之一)在我的团队中,并且想使用他私下创建的新哈希函数,我将继续使用bcrypt。 尽管我怀疑普罗沃斯先生是否足够愚蠢以至于建议使用这种算法。 他可能创建了下一个很棒的密码哈希算法,但是他可能会意识到,只有在他的安全专家对它进行评估之后,才能依靠它。
所以,当你需要存储用户凭据,只是请, 请与bcrypt,scrypt,或PBKDF2哈希他们。 这很容易。 不要试图变得聪明。
- 1甚至更好:不必存储用户凭据。 考虑使用OAuth提供程序或组织的内部身份系统。 它节省了一些精力,并使您的用户免于记住另一组凭据。 ↩
- 2本质上,这是Kerckhoff的原则 :“该系统一定不需要保密,并且可以在不引起麻烦的情况下被敌人偷窃” ↩
- 3好的,我想如果您要参加密码哈希竞赛或进行学术研究,那很好。 但是,除非经过全面的公开审查,否则您仍然不应该在实际的应用程序中使用它。 ↩
翻译自: https://www.javacodegeeks.com/2015/04/5-simple-rules-for-securely-storing-passwords.html
数据库储存密码 md5+盐