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

Posted

技术标签:

【中文标题】散列密码的最佳实践 - SHA256 还是 SHA512?【英文标题】:Best practice for hashing passwords - SHA256 or SHA512? 【发布时间】:2012-07-22 09:18:25 【问题描述】:

我目前正在使用带有盐的 SHA256 来散列我的密码。继续使用 SHA256 更好还是应该更改为 SHA512?

【问题讨论】:

由于密码与 sha-256 的冲突概率更高,因此更推荐使用 sha-512。这实际上意味着:在彩虹表攻击的情况下,使用 sha-256 算法散列的密码更容易破解。 @Monarchis 不会通过添加盐来解决吗? 【参考方案1】:

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

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

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

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

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

【讨论】:

【参考方案2】:

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

SHA256 和 SHA512 是消息摘要,它们从不用于密码散列(或key-derivation)函数。 (尽管消息摘要可以用作 KDF 的构建块,例如在带有 HMAC-SHA256 的 PBKDF2 中。)

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

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

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

***有这些功能的页面:

https://en.wikipedia.org/wiki/Argon2 https://en.wikipedia.org/wiki/Bcrypt https://en.wikipedia.org/wiki/Scrypt https://en.wikipedia.org/wiki/PBKDF2

编辑:NIST 不建议直接使用message digests(例如 SHA2 或 SHA3)来散列密码! Here is what NIST recommends:

记忆的秘密应使用合适的单向进行加盐和散列 密钥导出函数。密钥派生函数需要一个密码,一个 盐和作为输入的成本因子然后生成密码哈希。他们的 目的是让攻击者尝试每次密码猜测 获得一个密码哈希文件昂贵,因此成本 猜测攻击高或令人望而却步。合适的键示例 派生函数包括基于密码的密钥派生函数2 (PBKDF2) [SP 800-132] 和气球 [BALLOON]。

【讨论】:

根据您发布的破解站链接,SHA256 是一种加密散列函数,适合密码,因为冲突概率低。 @NikosC。我看了一下页面。充其量是措辞不佳。 (尽管它在某些时候声明使用加盐消息摘要来散列密码将落入字典攻击。)我不应该链接到它。字典攻击早已为人所知。 Robert Morris 和 Ken Thompson 于 1978 年 4 月 3 日发表的一篇论文“密码安全性:案例历史”对此进行了讨论并解释了工作因素包含在 Unix 的密码散列函数中。没有工作因素的密码方案比 1970 年代使用的密码方案弱! 还因为这些操作速度很快,它们可以相对容易地被暴力破解。我使用 bcrypt 的成本为 16(在我的开发 PC 和主机上大约需要 5 秒) 人们最近对这个答案投了反对票,但没有发表评论。如果您认为这个答案不好,请解释原因。 这个答案有太多错误,不适合发表评论。请看下面我的回答。对不起。【参考方案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 哈希函数。

与 SHA512 相比,许多人更喜欢 bcrypt,但 bcrypt 也仅在某些操作系统上可用。

SHA512 将在您的系统上可用,或者如果没有,您可能有一个太旧的系统,以至于选择散列算法是您的问题最少的问题。

首选 bcrypt 的一个常见原因是 bcrypt 是可调整的 - 您可以增加轮数(工作因子)以增加破解 bcrypt 哈希所需的时间。

但 SHA256 和 SHA512 也是可调的。虽然默认值为 5000 发,但您可以根据需要指定更多。 500000 需要我现在的电脑大约 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 秒的延迟。这足够长到非常痛苦,比你想要使用的时间长。足够长的时间来防止暴力攻击 - 但是如果他们愿意,一个具有良好破解装备和一点耐心的坚定对手仍然可以遍历字典。

“密码散列函数应该防御......彩虹表”

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

“目前最好的选择可能是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,但这是一个接近的电话。两者都可以。

【讨论】:

您将 SHA-256 和 SHA-512 与 Linux PAM SHA-crypt 混淆了。 SHA-256 和 SHA512 是 NIST 标准化的消息摘要算法,而 SHA-crypt 是由一群 Linux 开发人员发明的密码散列方案,并在此处描述:akkadia.org/drepper/SHA-crypt.txt。这些人不知道 PBKDF2,否则他们会使用带有 HMAC-SHA-256 和 HMAC-SHA-512 的 PBKDF2,而不是重新发明***。 SHA-256 和 SHA-512 不是密码散列方案。它们不可调整。 使用普通 SHA-256 或 SHA-512 对密码进行哈希处理是灾难的根源! -1 因为您似乎认为自己比那些认为 Argon2 是可用的最佳密码散列方案的密码学家更了解。 Password Hashing Competition 所做的工作可能是关于密码哈希的最佳信息来源。 我查看了您提供的两个链接。您是否注意到两位作者都推荐使用 Argon2? "已批准的 NIST 哈希算法。"好的散列算法不等于好的密码散列/密钥派生函数算法! @xuiqzy 正确的 NIST 来源实际上建议 SHA256 声明:“该标准指定可用于生成消息摘要的哈希算法。摘要用于检测消息是否已更改自生成了摘要。”。这与密码散列不同。这个答案有一些好处,但大多具有误导性,这就是我最终否决它的原因。【参考方案4】:

在大多数 64 位处理器上以 SHA256ses 32 位数学计算时,SHA512 可能会明显更快,而这种运算通常会稍微慢一些。

【讨论】:

建议的哈希算法都不适合哈希密码,您应该使用慢速密钥导出函数,如 PBKDF2 的 BCrypt。 32 位数学并不慢 ;p 它通常是相同的速度(如果有一个超级双时钟,32 位会更快) 我做了一些测试,确认 SHA-512 在 64 位 CPU 上快 50%:crypto.stackexchange.com/a/52646/42045【参考方案5】:

如果你问我,这已经得到了很好的回答:https://***.com/questions/3897434/password-security-sha1-sha256-or-sha512

Jeff 也有一篇关于散列的有趣帖子:http://www.codinghorror.com/blog/2012/04/speed-hashing.html

请注意,SHA512 的计算速度比 SHA256 慢很多。在安全散列的上下文中,这是一种资产。计算散列的速度越慢意味着破解所需的计算时间越长,因此如果你能负担得起计算成本,SHA512 将因此更加安全。

【讨论】:

在我的机器上,SHA512 只比 SHA256 慢 20%。我检查了“openssl speed sha256”与“”openssl speed sha512”。 “出于节制的原因”删除了 SO 链接。 由于链接到的 SO 答案已被删除,以下是其他一些相关的 SO 答案:***.com/questions/1592608/… 和 ***.com/questions/20186354/… 在本讨论中提到的某些情况下,SHA-512 可能比 SHA-256 快 crypto.stackexchange.com/questions/26336/… 请将链接中的相关段落添加到您的答案中,因为将来可能会关闭链接。

以上是关于散列密码的最佳实践 - SHA256 还是 SHA512?的主要内容,如果未能解决你的问题,请参考以下文章

什么是安全散列算法SHA256

什么是安全散列算法SHA256?

java中的SHA2密码散列

如何学好hac函数与sha256算法

MD5,sha1,sha256分别输出多少位啊?

加密相关知识总结