生成SHA256 / 512哈希时,是否有最小的“安全”数据要哈希?

时间:2011-01-13 04:35:50

标签: hash checksum sha

我听说在创建哈希时,如果使用小文件或数据量,结果哈希可能会更容易发生冲突。如果这是真的,是否应该使用最少的“安全”数据来确保不会发生这种情况?

我想这个问题也可以表达为:

可以安全可靠地散列的最小数据量是多少?

5 个答案:

答案 0 :(得分:86)

散列函数接受任意(或至少非常高)长度的输入,并产生固定长度的输出。可能的输入多于可能的输出,因此必须存在冲突。安全散列函数的重点在于它是“抗冲突的”,这意味着虽然碰撞必须在数学上存在,但实际计算碰撞却非常困难。因此,SHA-256和SHA-512没有已知的冲突,并且用于计算一个的最着名的方法(通过故意)是非常昂贵的,因此它们不会很快应用(整个美国联邦一个世纪的预算只能购买一小部分任务。)

所以,如果无法按目的实际完成,你可以期待不会因(坏)运气而碰撞。

此外,如果您将自己限制为非常短的输入,则有可能没有碰撞。例如,如果考虑12字节输入:有2个 96 可能的12个字节序列。这是巨大的(超过今天的技术可以列举)。然而,SHA-256将每个输入映射到256位值,即在更宽的空间(大小为2 256 )中的值。我们无法正式证明它,但很可能所有这些2 96 哈希值彼此不同。请注意,这没有实际结果:没有找到碰撞因为没有碰撞而没有发现碰撞之间没有可测量的差异,因为碰到它是极不可能的。

只是为了说明SHA-256的碰撞风险是多么低:考虑一下你从当地动物园或私人所有者那里逃脱的大猩猩所造成的风险。不可能?是的,但它仍然可能发生:似乎一只大猩猩逃离了Dallas zoo in 2004并且伤害了四个人;另一只大猩猩从same zoo in 2010逃脱了。假设整个地球上每6年只有一只狂暴的大猩猩(不仅是在达拉斯地区)而且你恰好是一个不走运的小伙子,在他的道路上,在65亿人口的人口中,然后是严重的风险 - 大猩猩的身体伤害可以估计为每天大约1比2 43.7 。现在,拿10个数千的PC,让他们找到SHA-256的碰撞。碰撞碰撞的几率接近每天2次 75 - 超过 10亿的可能性比愤怒的猿更少。结论是,如果你担心SHA-256碰撞,但是在任何时候都没有随身携带霰弹枪,那么你的优先级就是错误的。另外,不要乱用德克萨斯。

答案 1 :(得分:1)

不,消息长度不会影响碰撞的可能性。

如果是这种情况,则算法会被破坏。

您可以尝试通过对所有单字节输入运行SHA,然后对所有双字节输入运行,依此类推,看看是否发生冲突。可能不是,因为没有人发现SHA-256或SHA-512(或至少是kept it a secret from Wikipedia)的碰撞

答案 2 :(得分:0)

没有最小输入大小。 SHA-256算法实际上是随机映射,并且冲突概率不依赖于输入长度。即使是1位输入也是“安全的”。

请注意,对于SHA-256,输入被填充为512位(64字节)的倍数(SHA-512为1024的倍数)。采用12字节输入(如Thomas在其示例中所使用的),当使用SHA-256时,有2 ^ 96个可能的长度为64字节的序列。

作为示例,12字节输入 Hello There!(0x48656c6c6f20546865726521)将填充一位,然后填充351位,然后填充输入长度的64位表示位为0x0000000000000060以形成512位填充消息。该512位消息用作计算散列的输入。

更多细节可以在RFC中找到:4634“美国安全散列算法(SHA和HMAC-SHA)”,http://www.ietf.org/rfc/rfc4634.txt

答案 3 :(得分:0)

散列是256位长,任何超过256位的都会发生冲突。

你不能在没有碰撞的情况下将某些东西压缩成更小的东西,它无法用数学。

是的,因为算法和2到256的幂有很多不同的哈希值,但它们不是无碰撞的,这是不可能的。

答案 4 :(得分:-4)

非常依赖于您的应用程序:如果您只是通过网络散列“是”和“否”字符串来指示您是否应该给我10万美元的贷款,那将是一个非常大的失败 - 域名答案不能 大,所以有人可以轻松地检查电线上的观察到的哈希与“小输入”哈希输出的数据库。

如果您要包括日期,时间,我的姓名,我的税号,请求的金额,那么散列的数据量可能不会太多,但这些数据在预先计算的哈希表中的可能性是很苗条。

但我知道没有任何研究可以指出你超越我的直觉。遗憾。