當將原始二進制值流輸入到 SHA256 雜湊中並且在輸入流中遇到值 10000000 時,雜湊是否結束?
我正在從感測器獲取二進制數據並將其儲存在文件中。當從感測器讀取每個字節的數據時,它會進入 SHA256 散列。獲取的數據流的長度因一個會話而異。在會話流結束之前,輸入流中可能會遇到二進制值為 10000000 的單個樣本。SHA256 雜湊算法如何處理 10000000 值,因為這也是雜湊輸入末尾使用的標記?
加密安全雜湊函式可以處理任意字節序列,無論這些字節是什麼或它們可能具有什麼模式,可能直到指定的最大大小(對於 SHA-256,是 $ 2^{64} $ 位)。
確實,SHA-256 使用單個一位後跟零位作為其填充的一部分(Merkle-Dåmgard 方案)。但是,該模式可能毫無問題地出現在輸入流中,並且由於最後一個塊包含輸入長度,因此我們可以區分輸入中的該模式和該模式作為填充方案的一部分。所以沒有任何特定的帶內模式會導致雜湊突然結束。
請注意,其他雜湊算法,例如 SHA-3 和 BLAKE2,使用不同的填充方案,它們也可以毫無問題地處理任意輸入模式。這些填充方案雖然不同於 Merkle-Dåmgard 結構,但也被認為是安全的,並且出於其他原因實際上可能更可取。
通常,當我們編寫一個雜湊字節的 API 時,我們最終會得到三個函式:一個初始化函式,它使用適當的參數設置算法;一個更新函式,它將輸入輸入到散列;和一個終結函式,它執行填充,完成散列,並返回散列結果。因此,我們總是明確指出散列結束而不考慮輸入數據。
SHA-256 雜湊算法如何處理 10000000 值,因為這也是雜湊輸入末尾使用的標記?
SHA-256 不會在其輸入中對任何模式進行特殊處理。當使用 SHA-256 對非機密數據進行雜湊處理時,無需擔心這個內部細節。我將為這些添加一個原因:由於散列不是加密,因此沒有散列的解密過程,因此不需要辨識某些結束模式,例如在 CBC 模式下對可變大小明文的密文解密時會發生這種情況。
在處理秘密數據時,有理由擔心結束模式:SHA-256長度擴展屬性。它適用於任何Merkle-Damgård雜湊 $ H $ ,對於任何長度 $ \ell $ (達到如此巨大的限制),有一個短的位串 $ b_\ell $ (包括結束模式)和一個高效的可計算函式 $ H_\ell $ 這樣對於任何位串 $ m $ 的 $ \ell $ 位,對於任何位串 $ m’ $ (達到如此巨大的尺寸),它可以容納 $$ H(m\mathbin|b_\ell\mathbin|m’)=H_\ell(H(m)\mathbin|m’) $$
對於任何秘密 $ m $ 已知長度 $ \ell $ 和已知的雜湊 $ H(m) $ , 該屬性允許計算 $ H(m\mathbin|m’) $ 對於任何已知的 $ m’ $ 開始於 $ b_\ell $ . 這也足以證明 $ m\mapsto H(k\mathbin|m) $ 不是帶有密鑰的安全消息驗證碼 $ k $ .