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

eco*_*ner 28 passwords hash cryptography sha256 sha512

我目前正在使用带盐的SHA256来哈希我的密码.继续使用SHA256还是更改为SHA512会更好吗?

Erw*_*and 53

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

SHA256和SHA512是消息摘要,它们从来不是密码散列(或密钥派生)函数.(虽然消息摘要可以用作KDF的构建块,例如在带有HMAC-SHA1的PBKDF2中.)

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

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

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

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

  • 根据您发布的crackstation链接,SHA256是加密哈希函数,由于低冲突概率,**适用于密码. (5认同)
  • @NikosC.我看了一下这个页面.它充其量只是措辞不好.(虽然它在某些时候表示使用盐渍消息摘要来散列密码会落入字典攻击.)我不应该将它链接到它.字典攻击已为人所知很长时间了.Robert Morris和Ken Thompson撰写的一篇论文,"密码安全:案例历史.",日期为1978-04-03,讨论了它,并解释了Unix的密码散列函数中包含了一个工作因素.没有工作因素的密码方案比1970年代的密码方案弱! (3认同)
  • 此外,由于这些操作速度很快,因此可以相对轻松地进行暴力破解。我使用 bcrypt 的成本为 16(在我的开发 PC 和主机上大约 5 秒) (2认同)
  • 人们最近在没有评论的情况下对这个答案进行了投票.如果您认为这个答案很糟糕,请解释原因. (2认同)

Yan*_*niv 7

如果你问我这个问题已经得到了相当好的回答:https://stackoverflow.com/questions/3897434/password-security-sha1-sha256-or-sha512

杰夫也有一篇关于哈希的有趣帖子:http://www.codinghorror.com/blog/2012/04/speed-hashing.html

请注意,SHA512的计算速度比SHA256慢很多.在安全散列的情况下,这是一种资产.较慢的计算哈希意味着需要更多的计算时间才能破解,因此如果您能负担得起计算成本,SHA512将因此而更加安全.

  • SO链接“出于节制原因”被删除。 (2认同)
  • 由于已删除链接到SO的答案,因此这里有一些其他相关的SO答案:http://stackoverflow.com/questions/1592608/best-practices-safest-method-to-store-passwords-in-a-table/ 1592620#1592620和http://stackoverflow.com/questions/20186354/best-practice-of-hashing-passwords/20186472#20186472 (2认同)
  • 在本讨论中提到的某些情况下,SHA-512可能比SHA-256更快http://crypto.stackexchange.com/questions/26336/sha512-faster-than-sha256 (2认同)

Ben*_*ing 7

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 ...
Run Code Online (Sandbox Code Playgroud)

从 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},他们仍然需要破解哈希。)

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

  • @xuiqzy 对,实际上建议 SHA256 的 NIST 来源是这样说的:“该标准指定了可用于生成消息摘要的哈希算法。摘要用于检测自生成摘要以来消息是否已更改。”。这与密码散列不同。这个答案有一些优点,但大多具有误导性,这就是为什么我最终否决了它。 (4认同)
  • 您将 SHA-256 和 SHA-512 与 Linux PAM SHA-crypt 混淆了。SHA-256 和 SHA512 是 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 对密码进行哈希处理会导致灾难! (3认同)
  • -1,因为您似乎认为您比认为 Argon2 是可用的最佳密码哈希方案的密码学家更了解。密码哈希竞赛所做的工作可能是有关密码哈希的最佳信息来源。 (3认同)
  • “批准的 NIST 哈希算法。” 好的哈希算法与好的密码哈希/密钥导出函数算法不同! (3认同)

小智 5

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

  • 所提出的散列算法都不适合散列密码,您应该使用慢速密钥派生函数,如PBKDF2的BCrypt. (8认同)