我目前正在研究低記憶體嵌入式系統的韌體更新機制。
系統的一部分需要在發送檔案之前對二進制檔案進行散列(使用 SHA-256)(添加了其他安全功能,但不影響此問題)。設備必須在驗證之前驗證此哈希值,但記憶體非常低。它將以小塊接收資料,我想知道是否可以“即時”計算部分哈希,以避免在完全傳輸后再次加載整個二進制檔案。
例如,假設要散列的資料是“part1part2part3”。完整資料的hash為“hash”,“part1”的hash為“hash1”,“part2”的hash為“hash2”,“part3”的hash為“hash3”。
是否有任何數學運算可以將部分哈希轉換為完整哈希?就像是
hashReceived = hash
tempHash = operation(hash1,hash2)
tempHash = operation(tempHash, hash3)
if(hashReceived == tempHash)
... continue
else
... fail
我正在尋找 SHA-256 的數學屬性(類似于分配屬性),它可以允許這種行為而不會破壞任何 SHA-256 屬性。
uj5u.com熱心網友回復:
你描述的方式是不可能的。您不能組合“子哈希”來確定完整的哈希。如果你能做到這一點,散列將受到長度擴展攻擊并且不安全。(此處的“安全”是以相當精確和技術性的方式定義的。請參閱 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()不分配任何新記憶體,并且在使用資料包更新哈希后無需保留資料包。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/362052.html
下一篇:到最接近的零值的步數
