我目前使用SHA256和盐值对密码进行加密。是否应该继续使用SHA256还是改用SHA512更好?
我目前使用SHA256和盐值对密码进行加密。是否应该继续使用SHA256还是改用SHA512更好?
切换到SHA512几乎不会使您的网站更安全。 您不应编写自己的密码哈希函数。 相反,使用现有实现。
SHA256和SHA512是消息摘要,它们从未被用作密码哈希(或key-derivation)函数。(虽然消息摘要可以用作KDF的构建块,例如使用HMAC-SHA256的PBKDF2。)
密码哈希函数应该防止字典攻击和彩虹表。为了防止字典攻击,密码哈希方案必须包括一个工作因素,使其尽可能缓慢。
目前,最好的选择可能是Argon2。这个密码哈希函数族赢得了2015年的密码哈希竞赛。
如果Argon2不可用,则唯一的其他标准化密码哈希或密钥派生函数是PBKDF2,这是一个较老的NIST标准。如果不需要使用标准,则其他选择包括bcrypt和scrypt。
维基百科有这些函数的页面:
编辑:NIST不建议直接使用消息摘要,例如SHA2或SHA3来哈希密码!这是NIST的建议:
记忆的秘密应使用适当的单向密钥派生函数进行加盐和哈希。密钥派生函数将密码、盐和成本因素作为输入,然后生成密码哈希。它们的目的是使攻击者通过获得密码哈希文件的每个密码猜测尝试变得昂贵,从而使猜测攻击的成本高或禁止。适当的密钥派生函数示例包括基于密码的密钥派生函数2(PBKDF2)[SP 800-132]和Balloon [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轮,但您可以指定更多。对于我的当前PC来说,500000需要大约0.45秒的时间来计算,感觉还可以接受。
e.g.:
password required pam_unix.so sha512 shadow rounds=500000 ...
在大多数64位处理器上,计算SHA512时可能比SHA256快得多,因为SHA256使用32位数学运算,这种运算通常稍慢一些。
除了关于密码的真正好的和更实用/准确的答案之外,我有另一个观点(我认为这个观点是与其他观点相辅相成的)。
我们使用工具和公司进行漏洞评估。在代码中,我们遇到的一个红旗是使用MD5。这与密码无关...它只是为了生成字符串的摘要。MD5很短,对于这种特定情况来说确实不是安全问题。
问题是,需要花费时间来配置扫描仪以忽略这些误报。而且,修改由外部供应商编写的安全报告,以将“高风险”发现更改为“低风险”或删除,要困难得多。
所以我的观点是,为什么不使用更好的算法呢?在我的情况下,我开始使用SHA512代替MD5。与MD5相比,长度有点过长,但对我来说并不重要。显然,需要考虑计算或存储方面的性能需求。
顺便说一句,在我的情况下,从MD5切换到SHA256也可能没问题,不会引起任何警报...但这让我想到了“为什么不使用更好的算法”的评论。