有可能通过小块来计算哈希吗



我目前正在为内存不足的嵌入式系统开发固件更新机制。

部分系统要求在发送文件之前对二进制文件进行散列(使用SHA-256((添加了其他安全功能,但不影响此问题(。设备必须在验证该哈希之前对其进行验证,但内存不足。它将接收小块的数据,我想知道是否有可能计算部分散列";在飞行中";,以避免在完全传输之后再次加载整个二进制。

举个例子,假设要散列的数据是";part1part2part3";。完整数据的散列是"0";hash";,"的散列;第1部分";是";hash1";,"的散列;第2部分";是";hash2";以及"0"的散列;第3部分";是";hash3";。

我能做什么数学运算把部分散列转换成完整散列吗?类似的东西

hashReceived = hash
tempHash = operation(hash1,hash2)
tempHash = operation(tempHash, hash3)
if(hashReceived == tempHash)
... continue
else
... fail

我正在寻找SHA-256的数学性质(类似于分配性质(,它可以在不破坏任何SHA-256性质的情况下允许这种行为。

您描述这一点的方式是不可能的。您不能将";亚灰;以确定完整散列。如果可以这样做,散列将受到长度扩展攻击,并且不安全。(这里的"安全"是以一种相当精确和技术性的方式定义的。请参阅Stef关于放宽这一要求的其他哈希方法的链接。(

但是,正如问题注释所指出的,完全可以将数据流式传输到SHA256中,而无需将所有数据保存在内存中。这是计算哈希函数的正常方式。SHA256适用于64字节的块大小。这是一次需要保存的所有数据,加上32字节的状态。

大多数常见的哈希库都将此作为API的一部分。它通常看起来像:

hasher = create_hasher()
update_hash(hasher, data1)
update_hash(hasher, data2)
update_hash(hasher, data3)
final_hash = compute_hash(hasher)

本例中的hasher在每次调用update_hash时都会改变其内部状态,然后在调用compute_hash时结束散列。对update_hash()的调用不会分配任何新内存,并且在数据包用于更新哈希之后,不需要保留这些数据包。

最新更新