Hash 理想的密码散列算法是什么样的?

Hash 理想的密码散列算法是什么样的?,hash,passwords,md5,sha1,Hash,Passwords,Md5,Sha1,免责声明:在这方面有许多类似的问题,但我正在寻找一个切实可行的建议,而不仅仅是一般原则。另外,请随意指出“理想”算法的实现(PHP会更好),但请提供具体说明(它是如何工作的) 计算存储在数据库中的密码哈希字符串的最佳方法是什么?我知道我应该: 用盐 多次迭代哈希过程(哈希链) 我在考虑使用这样的算法: x = md5( salt + password); repeat N-times: x = md5( salt + password + x ); 我相信这是相当安全的,但我想到了

免责声明:在这方面有许多类似的问题,但我正在寻找一个切实可行的建议,而不仅仅是一般原则。另外,请随意指出“理想”算法的实现(PHP会更好),但请提供具体说明(它是如何工作的)

计算存储在数据库中的密码哈希字符串的最佳方法是什么?我知道我应该:

  • 用盐
  • 多次迭代哈希过程(哈希链)
我在考虑使用这样的算法:

x = md5( salt + password);
repeat N-times:
    x = md5( salt + password + x );
我相信这是相当安全的,但我想到了几个问题:

  • 在salt中包含用户名是否有益

  • 我决定为所有用户使用一种普通食盐,这有什么坏处吗

  • 如果有的话,建议的最小盐长度是多少

  • 我应该使用md5、sha还是其他什么

  • 上述算法有什么问题/有什么建议吗

  • 。。。(请随时提供更多信息:)

  • 我知道决策必然取决于具体情况,但我正在寻找一种解决方案:

    • 提供尽可能多的安全
    • 足够快(在一台像样的机器上小于0.5秒)

    那么,理想的算法是什么样的,最好是在伪代码中

    我倾向于使用固定的应用程序salt、用户名和密码

    例如

    string prehash = "mysaltvalue" + "myusername" + "mypassword";
    
    这里的好处是,使用相同密码的人不会得到相同的散列值,并且它可以防止有权访问数据库的人通过其他用户复制他们的密码——当然,如果您可以访问数据库,您就不需要通过黑客登录来获取数据;)

    在我看来,salt长度并不重要,哈希值长度始终是32(使用MD5,这也是我要使用的)

    我想说的是,就安全性而言,这种密码加密就足够了,最重要的是确保您的应用程序/数据库中没有安全漏洞

    而且,我也不会为重复的散列而烦恼,在我看来这没什么意义。有人必须知道你的算法才能尝试用这种方式破解它,然后不管它是被散列一次还是多次,如果他们知道,他们就知道了,现在“理想”的密码散列函数是。它包括盐处理和可配置的迭代次数。有一个问题

    第二个最好的方法是,它依赖于一个底层哈希函数,并且与您建议的有点类似。这就是为什么bcrypt比PBKDF2“更好”的原因


    关于你的具体问题:

    一,。在salt中包含用户名是否有益

    不是真的

    二,。我决定为所有用户使用一种普通食盐,这有什么坏处吗

    是的:它消除了吃盐的好处。存在的唯一原因是每个哈希密码都是唯一的。这可以防止攻击者攻击两个哈希密码,所需的工作量比攻击一个哈希密码少两倍。盐必须是独一无二的。即使每个用户都有一个salt也是不好的:当用户更改密码时,salt也必须更改。当salt被重用/共享时,攻击者可能应用的优化类型包括(但不限于)预计算哈希表,例如

    三,。如果有的话,建议的最小盐长度是多少

    盐必须是独一无二的。独特性是很难保持的。但是,通过使用足够长的随机盐(由一个好的随机数生成器生成,最好是一个密码学上很强的随机数生成器),您可以以足够高的概率获得唯一性。128位的盐足够长了

    四,。我应该使用md5、sha还是其他什么

    MD5不利于公共关系。它具有已知的弱点,这些弱点可能适用于也可能不适用于给定的用途,并且很难以任何可靠性“证明”这些弱点不适用于特定情况。SHA-1更好,但不“好”,因为它也有缺点,尽管比MD5严重得多。SHA-256是一个合理的选择。如上所述,对于密码散列,您需要一个在并行体系结构(如,和SHA-256)上伸缩性不好的函数,这就是为什么bcrypt中使用的河豚衍生物更可取的原因

    五,。上述算法有什么问题/有什么建议吗

    这是自制的。那太糟糕了。问题是没有已知的密码算法安全性测试。我们所能期望的最好办法是让数百名专业密码学家在几年内尝试破解一个算法——如果他们不能,那么我们可以说,尽管该算法并没有真正“被证明”是安全的,但至少弱点一定不明显。Bcrypt已经存在、广泛部署和分析了12年。即使有StackOverflow的帮助,你自己也无法战胜它


    作为一名专业的密码学家,我对在MD5甚至SHA-256中使用简单的连接表示怀疑:这些是散列函数,可以抵抗冲突,但不能提供安全性(存在所谓的“长度扩展攻击”)。在PBKDF2中,哈希函数不是直接使用的,而是通过。

    多轮哈希增加了所需的计算量。一次性身份验证很便宜,但对攻击者来说很快就会变得更昂贵。确切地说。:)@穆塞凡:我在寻找“最佳实践”解决方案,而不是“足够好”。把事情做好并没有什么坏处——只是有太多糟糕的安全解决方案(不要说你的就是其中之一)。Salt键的长度很重要,因为它会延长散列字符串,这需要更大的rainbow表(我认为)。虽然我同意其他的观点,但这是一个全新的话题@约翰多:如果他们知道salt键,那么长度并不重要,如果他们使用ra