是否可以通过小块来计算哈希值?

Bap*_*teC 5 security algorithm hash sha256

我目前正在研究低内存嵌入式系统的固件更新机制。

系统的一部分需要在发送文件之前对二进制文件进行哈希处理(使用 SHA-256)(添加了其他安全功能,但不会影响此问题)。设备必须在验证该哈希值之前对其进行验证,但内存非常低。它将接收小块的数据,我想知道是否可以“即时”计算部分哈希,以避免在完全传输后再次加载整个二进制文件。

举个例子,假设要散列的数据是“part1part2part3”。完整数据的哈希为“hash”,“part1”的哈希为“hash1”,“part2”的哈希为“hash2”,“part3”的哈希为“hash3”。

我可以执行任何数学运算将部分哈希值转换为完整哈希值吗?就像是

hashReceived = hash
tempHash = operation(hash1,hash2)
tempHash = operation(tempHash, hash3)
if(hashReceived == tempHash)
... continue
else
... fail
Run Code Online (Sandbox Code Playgroud)

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

Rob*_*ier 4

你所描述的方式是不可能的。您不能组合“子哈希”来确定完整哈希。如果你这样做,哈希值将受到长度扩展攻击并且不安全。(这里的“安全”是以相当精确和技术性的方式定义的。请参阅 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)
Run Code Online (Sandbox Code Playgroud)

在此hasher示例中,每次update_hash调用时都会改变其内部状态,然后在compute_hash调用时最终确定哈希值。调用update_hash()不会分配任何新内存,并且在使用数据包更新哈希后无需保留数据包。