我目前正在使用带有盐的 SHA256 来散列我的密码。继续使用 SHA256 更好还是应该更改为 SHA512?
5 回答
切换到 SHA512 几乎不会让您的网站更安全。您不应该编写自己的密码散列函数。相反,使用现有的实现。
SHA256 和 SHA512 是消息摘要,它们从来都不是密码散列(或密钥派生)函数。(尽管消息摘要可以用作 KDF 的构建块,例如在 PBKDF2 中使用 HMAC-SHA256。)
密码散列函数应该防御字典攻击和彩虹表。为了防御字典攻击,密码散列方案必须包含一个工作因素,以使其尽可能慢。
目前,最好的选择可能是Argon2。这一系列密码哈希函数赢得了 2015 年密码哈希竞赛。
如果Argon2不可用,则唯一的其他标准化密码散列或密钥派生函数是PBKDF2,这是一个旧的 NIST 标准。如果不需要使用标准,其他选择包括bcrypt和scrypt。
维基百科有这些功能的页面:
- 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 不建议直接使用 SHA2 或 SHA3 等消息摘要来散列密码!这是 NIST 的建议:
记忆的秘密应使用合适的单向密钥派生函数进行加盐和散列。密钥派生函数将密码、盐和成本因子作为输入,然后生成密码哈希。他们的目的是让已经获得密码哈希文件的攻击者每次猜测密码都变得昂贵,因此猜测攻击的成本很高或令人望而却步。合适的密钥导出函数的示例包括基于密码的密钥导出函数 2 (PBKDF2) [SP 800-132] 和气球 [BALLOON]。
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 需要我目前的电脑大约 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,但这是一个很接近的电话。哪一个都好。
在大多数 64 位处理器上以 SHA256ses 32 位数学计算时,SHA512 可能会明显更快,这种运算通常会稍微慢一些。
如果您问我,这已经得到了很好的回答: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 将因此更加安全。
除了关于密码的非常好的和更实用/准确的答案之外,我还有另一个观点(我认为这是对其他观点的补充)。
我们使用工具和公司来执行漏洞评估。我们在代码中遇到的一个危险信号是使用了 MD5。这与密码无关……只是为字符串生成摘要。MD5 又好又短,对于这个特定场景来说真的不是一个安全问题。
问题是,配置扫描仪以忽略这些误报需要时间。并且修改外部供应商编写的安全报告要困难得多,以便将“高风险”发现更改为“低风险”或删除。
所以我的观点是,为什么不使用更好的算法呢?就我而言,我开始使用 SHA512 代替 MD5。长度比MD5有点猥琐,但对我来说无所谓。显然,需要考虑自己在计算或存储方面的性能需求。
顺便说一句,从 MD5 切换到 SHA256 也可能没问题,不会引发任何危险信号……但这让我想到了“为什么不使用更好的算法”的评论。