哈希密码的最佳实践 - SHA256还是SHA512?

51

我目前使用SHA256和盐值对密码进行加密。是否应该继续使用SHA256还是改用SHA512更好?


2
由于使用sha-256算法的密码发生碰撞的概率更高,因此建议使用sha-512。这实际上意味着:在彩虹表攻击的情况下,使用sha-256算法哈希的密码更容易被破解。 - Monarchis
3
这句话的意思是:@Monarchis,如果加点盐会不会解决这个问题?我可以将其翻译为:加盐能否解决这个问题? - cat_in_hat
5个回答

87

切换到SHA512几乎不会使您的网站更安全。 您不应编写自己的密码哈希函数。 相反,使用现有实现。

SHA256和SHA512是消息摘要,它们从未被用作密码哈希(或key-derivation)函数。(虽然消息摘要可以用作KDF的构建块,例如使用HMAC-SHA256的PBKDF2。)

密码哈希函数应该防止字典攻击和彩虹表。为了防止字典攻击,密码哈希方案必须包括一个工作因素,使其尽可能缓慢。

目前,最好的选择可能是Argon2。这个密码哈希函数族赢得了2015年的密码哈希竞赛。

如果Argon2不可用,则唯一的其他标准化密码哈希或密钥派生函数是PBKDF2,这是一个较老的NIST标准。如果不需要使用标准,则其他选择包括bcryptscrypt

维基百科有这些函数的页面:

编辑:NIST不建议直接使用消息摘要,例如SHA2或SHA3来哈希密码!这是NIST的建议

记忆的秘密应使用适当的单向密钥派生函数进行加盐和哈希。密钥派生函数将密码、盐和成本因素作为输入,然后生成密码哈希。它们的目的是使攻击者通过获得密码哈希文件的每个密码猜测尝试变得昂贵,从而使猜测攻击的成本高或禁止。适当的密钥派生函数示例包括基于密码的密钥派生函数2(PBKDF2)[SP 800-132]和Balloon [BALLOON]。


11
根据您发布的crackstation链接,SHA256是一种加密哈希函数,并且由于碰撞概率较低,适用于密码。 - Nikos C.
6
@NikosC。我看了一下这个页面。最好的情况是用词不当。(尽管它在某些地方指出,使用加盐消息摘要来哈希密码将会遭受字典攻击。)我不应该链接到它。字典攻击已经为人所知很长时间了。罗伯特·莫里斯(Robert Morris)和肯·汤普森(Ken Thompson)于1978年4月3日发表的一篇论文《密码安全:案例研究》讨论了它,并解释了Unix密码哈希函数中包含的工作因素。没有工作因素的密码方案比上世纪70年代使用的更弱! - Erwan Legrand
2
由于这些操作速度快,它们可以相对容易地被暴力破解。我使用成本为16的bcrypt(在我的开发PC和主机上大约需要5秒)。 - My1
3
最近有人对这个回答进行了负评,但没有留下评论。如果你认为这个回答不好,请解释一下原因。 - Erwan Legrand
1
这个答案有太多问题,无法在评论中解决。请看下面的我的回答。抱歉。 - Ben Aveling

13

SHA256仍然被NIST批准,但如果可能的话,最好更改为SHA512或bcrypt。

撰写时,NIST批准的哈希函数列表包括:SHA-1、SHA-224、SHA-256、SHA-384、SHA-512、SHA-512/224、SHA-512/256和SHA3-224、SHA3-256、SHA3-384、SHA3-512、SHAKE128和SHAKE256。

请参见https://csrc.nist.gov/projects/hash-functions

根据您运行的操作系统,您可能无法访问SHA3或SHAKE哈希函数。

许多人喜欢bcrypt而不是SHA512,但bcrypt也仅在某些操作系统上可用。

SHA512将在您的系统上可用,如果没有,则您的系统可能太旧了,哈希算法的选择是您问题中最小的一部分。

通常给出偏爱bcrypt的原因之一是bcrypt是可调节的-您可以增加轮数(工作因素)以增加破解bcrypt哈希所需的时间。

但是SHA256和SHA512也是可调节的。虽然默认值为5000轮,但您可以指定更多。对于我的当前PC来说,500000需要大约0.45秒的时间来计算,感觉还可以接受。

e.g.:

password    required    pam_unix.so sha512 shadow rounds=500000 ...

从SHA256到SHA512的原因是SHA256需要更多的轮数才能像SHA512一样安全,所以虽然它不是不安全,但它不够安全。
例如,请参见:https://medium.com/@davidtstrauss/stop-using-sha-256-6adbb55c608 加密技术变化很快,所以你得到的任何答案明天可能被证明是错误的,但当前的最新技术认为,虽然bcrypt可能比SHA512更好,但SHA512也可以。
如果SHA512是您“开箱即用”的选项,请使用它(而不是SHA256),并且不要担心bcrypt或任何SHA3系列,直到它们成为您发行版的标准。
作为旁注,当前排名第一的答案有许多错误或误导性的说法。
“切换到SHA512几乎不会使您的网站更安全。”
这是误导性的。切换到SHA512会使您的网站稍微更安全。 SHA256并不像SHA512那样好,但也不是可怕的。目前没有明显比SHA512更好且可能在您的系统上可用的东西。Bcrypt可能更好,但这并不清楚,并且许多系统上都无法使用bcrypt。 SHA3系列可能更好,但也没有广泛使用。
“SHA256和SHA512从来没有被设计成密码哈希”
这是错误的。SHA256和SHA512都是经过批准的NIST哈希算法。
“为了防御字典攻击,密码哈希方案必须包括一个工作因素,使其尽可能缓慢。”
这是错误的。高工作因素将保护免受暴力破解哈希的攻击,但不能防御字典攻击。没有低到可以使用但足以防御字典攻击的工作因素。如果您的密码是字典中的单词,则会受到字典攻击的影响。防御字典攻击的方法是不使用可以在字典中找到的密码。
在我的当前PC上,轮数的限制似乎是1000万,每输入一个密码需要8.74秒的延迟。这足够长,非常痛苦,比您想使用的时间更长。它足以防止暴力攻击-但是一个有决心的对手,配备良好的破解装置和一点耐心,仍然可以遍历字典。
“密码哈希函数应该防御…彩虹表”
这是最好的情况下也很容易引起误解。防止彩虹表攻击的方法是确保每个密码都有自己的“盐”。这在当今几乎是标准做法,并且发生在调用哈希函数之前。(加盐意味着在哈希密码之前添加一个随机字符串。盐与密码一起存储,因此它不是一个秘密,但这意味着即使用户选择了一个众所周知的密码,攻击者也不能仅仅识别出{这个哈希}属于{那个密码},他们仍然需要破解哈希。)
“目前,最好的选择可能是Argon2。这个密码哈希函数系列在2015年赢得了密码哈希竞赛。”
这是不清楚的。任何“新”的加密函数都可能有不明显的被破解的方式,这就是为什么大多数人更喜欢广泛使用的函数。此外,Argon2可能对您不可用。
“其他选择,如果不需要使用标准,则包括bcrypt和scrypt。”
这是不清楚的。曾经,scrypt被视为比bcrypt更好的选择。然而,由于各种原因,情绪已经从scrypt转向bcrypt。例如:请参见https://blog.ircmaxell.com/2014/03/why-i-dont-recommend-scrypt.html 重申一下,在这个时候,SHA512似乎是一个不错的选择,bcrypt也是。
SHA512已获得NIST认证,而bcrypt没有。
SHA512几乎肯定会在您的系统上可用。bcrypt可能可用,也可能不可用。
如果两个都在你的系统上,我可能会推荐bcrypt,但这是一个很难决定的问题。两者都可以。

4
你把SHA-256和SHA-512算法和Linux PAM SHA-crypt混淆了。 SHA-256和SHA-512是由NIST标准化的信息摘要算法,而SHA-crypt是一种由一些Linux开发人员发明的密码哈希方案,可以在这里找到详细信息:https://akkadia.org/drepper/SHA-crypt.txt。这些人不知道PBKDF2,否则他们会使用PBKDF2与HMAC-SHA-256和HMAC-SHA-512来代替重复发明轮子。 SHA-256和SHA-512不是密码哈希方案。它们不能被调整。 使用纯SHA-256或SHA-512哈希密码是一场灾难的配方! - Erwan Legrand
3
-1,因为你似乎认为自己比评判Argon2为最佳密码哈希方案的密码学家更懂。密码哈希竞赛所做的工作可能是有关密码哈希的最佳信息来源。 - Erwan Legrand
1
我查看了你提供的两个链接。你有没有注意到两位作者都建议使用Argon2? - Erwan Legrand
3
“approved NIST hash algorithms.” 的意思是“NIST 审定的哈希算法。”一个好的哈希算法和一个好的密码哈希/密钥派生函数算法并不相同! - xuiqzy
3
@xuiqzy,正确的NIST来源实际上建议SHA256,并声明:“本标准规定了可用于生成消息摘要的哈希算法。摘要用于检测自生成摘要以来消息是否已更改。” 这与密码哈希不同。 这个答案有一些好的观点,但大多数是误导性的,这就是为什么我最终会给它投反对票的原因。 - Philipp
显示剩余6条评论

6
这个问题已经得到了合理的回答,如果你问我: https://stackoverflow.com/questions/3897434/password-security-sha1-sha256-or-sha512 Jeff也发表了有关散列的有趣帖子:http://www.codinghorror.com/blog/2012/04/speed-hashing.html 请注意,SHA512的计算速度比SHA256慢得多。在安全哈希的背景下,这是一种优势。 计算速度较慢的哈希意味着破解需要更多的计算时间,因此如果您可以承受计算成本,则基于此原因SHA512更加安全。

1
在我的电脑上,SHA512仅比SHA256慢20%。我已经使用“openssl speed sha256”与“openssl speed sha512”进行了检查。 - Erwan Legrand
2
该SO链接因“版主原因”而被移除。 - Joe B.
2
由于链接到的SO答案已被删除,这里提供一些其他相关的SO答案:https://dev59.com/C3I-5IYBdhLWcg3w99kH#1592620 和 https://dev59.com/nnnZa4cB1Zd3GeqPrIaA#20186472 - michael
2
在某些情况下,如本讨论所述,SHA-512可能比SHA-256更快。http://crypto.stackexchange.com/questions/26336/sha512-faster-than-sha256 - prasun
请将链接中的相关段落添加到您的答案中,因为链接可能在未来失效。 - xuiqzy
stackoverflow的链接已经失效。 - Phoenix

6

在大多数64位处理器上,计算SHA512时可能比SHA256快得多,因为SHA256使用32位数学运算,这种运算通常稍慢一些。


11
建议不使用任何提议中的哈希算法来进行密码哈希,而应该使用像BCrypt或PBKDF2这样的缓慢密钥派生函数。请注意,此翻译可能需要根据上下文进行调整以确保准确性和连贯性。 - martinstoeckli
1
32位数学并不慢; p。通常速度相同(如果有一个超级时钟,32位将会更快)。 - Top Sekret
我进行了一些测试,证实SHA-512在64位CPU上比较快,速度提高了50%:https://crypto.stackexchange.com/a/52646/42045 - Vlastimil Burián

0

除了关于密码的真正好的和更实用/准确的答案之外,我有另一个观点(我认为这个观点是与其他观点相辅相成的)。

我们使用工具和公司进行漏洞评估。在代码中,我们遇到的一个红旗是使用MD5。这与密码无关...它只是为了生成字符串的摘要。MD5很短,对于这种特定情况来说确实不是安全问题。

问题是,需要花费时间来配置扫描仪以忽略这些误报。而且,修改由外部供应商编写的安全报告,以将“高风险”发现更改为“低风险”或删除,要困难得多。

所以我的观点是,为什么不使用更好的算法呢?在我的情况下,我开始使用SHA512代替MD5。与MD5相比,长度有点过长,但对我来说并不重要。显然,需要考虑计算或存储方面的性能需求。

顺便说一句,在我的情况下,从MD5切换到SHA256也可能没问题,不会引起任何警报...但这让我想到了“为什么不使用更好的算法”的评论。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接