algorithm - 是否可以通过小块计算哈希?

标签 algorithm security 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

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

最佳答案

您描述的方式是不可能的。您不能组合“子哈希”来确定完整的哈希。如果你能做到这一点,散列将受到 length-extension attacks 的约束。并且不安全。 (此处的“安全”以相当精确和技术性的方式定义。请参阅 Stef 的链接,了解放宽此要求的其他散列方法。)

但是,正如问题的评论所指出的,完全有可能将数据流式传输到 SHA256,而无需将所有数据都保存在内存中。这是计算散列函数的正常方式。 SHA256 适用于 64 字节的 block 大小。这是您一次需要保存的所有数据,外加 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() 不会分配任何新内存,并且在使用数据包更新哈希后也无需保留数据包。

关于algorithm - 是否可以通过小块计算哈希?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70035486/

相关文章:

algorithm - 分析5^(log2N)和N^(1/2)之间的大O关系,如何证明?

node.js - 服务器日志中对第三方网站的请求

Spring Security 授权标签 - HTTP 状态 500

hash - Erlang 密码模块 - ECDSA、RSA、SHA256 等

algorithm - 什么是好的哈希函数?

c++ - 如何在字符串的二维 vector 中找到最大平均标记?

python-3.x - 如何为我正在开发的某个新数字系统制作算法?

linux - 非免费驱动程序的安全影响

Python 哈希模块,提供一种获取二进制摘要 key 的方法

ruby - 使用 Fermat 分解方法的最大素因子 Ruby