散列密码的最佳实践 - SHA256或SHA512?

时间:2012-07-24 04:53:40

标签: hash cryptography passwords sha256 sha512

我目前正在使用SHA256加盐来哈希我的密码。继续使用SHA256或者我应该更改为SHA512会更好吗?

5 个答案:

答案 0 :(得分:50)

切换到SHA512很难让您的网站更安全。 您不应该编写自己的密码散列函数。而是使用现有的实现。

SHA256和SHA512是消息摘要,它们从不意味着是密码散列(或密钥派生)功能。 (尽管消息摘要可以用作KDF的构建块,例如在带有HMAC-SHA1的PBKDF2中。)

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

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

如果 Argon2 不可用,则唯一的其他标准化密码哈希或密钥派生功能是 PBKDF2 ,这是一个古老的NIST标准。其他选择,如果不需要使用标准,请包括 bcrypt scrypt

维基百科有这些功能的页面:

答案 1 :(得分:7)

如果你问我: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将因此而更加安全。 / p>

答案 2 :(得分:5)

在大多数64位处理器上计算时,SHA512可能明显更快,因为SHA256采用32位数学运算,这种操作通常稍慢。

答案 3 :(得分:3)

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发,如果需要,您可以指定更多。 500000需要花费我当前的PC大约0.45秒来计算,这可以忍受。

例如:

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秒的延迟。足够长的时间使它非常痛苦,比您要使用的时间还要长。足够长的时间来防止暴力攻击-但是,如果他们愿意的话,坚定的对手,良好的破解能力和一点耐心仍然可以遍历字典。

“密码哈希函数应防御...彩虹表”

这充其量是一种误导。防止彩虹表的方法是确保每个密码都有自己的“盐”。如今,这几乎是标准做法,它发生在调用哈希函数之前。 (Salt表示在对哈希进行哈希处理之前将一个随机字符串添加到密码中。盐与密码一起存储,因此这不是秘密,但这确实意味着即使用户选择了众所周知的密码,攻击者也无法认识到{this hash}属于{that password},他们仍然需要破解哈希。)

“目前,最好的选择可能是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 :(得分:0)

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

我们使用工具和公司来执行漏洞评估。我们在代码中遇到的一个危险信号是使用 MD5。这与密码无关……它只是为字符串生成摘要。 MD5 很好而且很短,对于这个特定场景来说真的不是安全问题。

问题是,配置扫描器以忽略这些误报需要时间。修改外部供应商编写的安全报告,将“高风险”的结果改为“低风险”或删除,难度更大。

所以我的观点是,为什么不使用更好的算法?就我而言,我开始使用 SHA512 代替 MD5。长度比MD5有点猥琐,但对我来说没关系。显然,无论是计算还是存储,都需要考虑自己的性能需求。

顺便说一下,从 MD5 切换到 SHA256 也可能没问题,并且不会引发任何危险信号……但这使我想到了“为什么不使用更好的算法”的评论。