使用 SHA-256 对字符串(如密码)进行散列时,我要散列的字符串的长度是否有限制?例如,散列小于 64 个字符的字符串是否只有“安全”?
3 回答
在技术上是有限制的,但它相当大。用于 SHA-256 的填充方案要求输入的大小(以位为单位)表示为 64 位数字。因此,最大大小为 (2 64 -1)/8 字节 ~= 2'091'752 TB。
这使得该限制几乎完全是理论上的,而不是实际的。
大多数人无论如何都没有存储几乎那么多数据的存储空间,但即使他们有,连续处理所有数据以产生单个散列也会花费大多数人认为令人望而却步的时间。
粗略的计算表明,即使是目前最快的企业级 SSD 1列在 Tom 的硬件上,并将它们条带化 16 宽以提高带宽,仅读取该数量的数据仍需要大约 220 年。
1. 截至 2016 年 4 月。
除了最大消息大小为 2 64 -1 位之外,没有这样的限制。SHA2 经常用于为可执行文件生成哈希值,这些哈希值往往比几十个字节大得多。
NIST 标准FIPS 180-4中给出了上限。上限的原因是针对 Merkle-Damgard 构造的神器的 MOV 攻击的填充方案。消息长度l
最后在填充期间附加到消息中。
然后附加等于
l
使用二进制表示表示的数字的 64 位块
因此,按照 NIST 标准,可以使用 SHA-256 进行哈希处理的最大文件大小2^64-1
以位为单位(大约 2.305 艾字节 - 这接近估计的 NSA 在犹他州的数据中心的较低范围,因此您不必担心) .
NIST 启用大小为零消息的散列。因此消息长度从0
到开始2^64-1
。
如果您需要散列大于2^64-1
然后的文件,请使用具有限制的 SHA-5122^128-1
或使用没有限制的 SHA3。