從不同來源創建控制雜湊字元串,使用這種方式比較時是否有區別、優點或缺點?
我想從幾個輸入/源創建應該形成一個雜湊值,以便稍後控制不同的想法。
例子:
- 字元串 + 文件
- 字元串 + 字元串
- 文件+文件
- 字元串 + 文件 + 字元串
從現在的邏輯來看,有不同的方法可以做到這一點:
CREATE HASH [(HASH(String)) + (HASH(File))] = HASH-RESULT
CREATE HASH [( (HASH(String)) (HASH(File)) )] = HASH-RESULT
CREATE HASH [(String + File)] = HASH-RESULT
CREATE HASH [( (String)(File) )] = HASH-RESULT
我用不同的方法(連接、加法、求和等)用相同的來源得到不同的結果。
這是一個關於散列的邏輯問題,我需要一個意見。
這種方法是否有優點或缺點或安全原因,或者我將使用哪種方法無關緊要?
我希望我能傳達我的問題,這與算法無關
這是這篇文章的一個擴展問題:
我有不止一種結果不同的解決方案/方式/方法。
假設文件和字元串沒有區別(我們將使用 $ s_1 $ 和 $ s_2 $ ),我們可以看看擁有速度和前像和碰撞攻擊。
我們假設 + 為串聯求和,空格為串聯,並替換通常的 $ \mathbin| $ 用串聯來消除歧義。
我們從簡單的開始;
- >
創建雜湊
$$ (String + File) $$= 雜湊結果
$$ h = H(s_1) + H(s_2) $$
明顯的攻擊正在替換 $ s_1 $ 和 $ s_2 $ 和 $ s_2 $ 和 $ s_1 $ 我們將得到相同的雜湊值,因為加法是可交換的;
$$ H(s_1) + H(s_2) = H(s_2) + H(s_1) $$
- 這是給定雜湊值的第二次原像攻擊,並且
- 如果攻擊者可以自由選擇碰撞攻擊 $ h $ 價值。對於給定的 $ h $ 值,我們需要找到兩個輸入的總和等於 $ h = H(a) + H(b) $
此外,加法有一點溢出的可能性。要是 $ \ell $ 大小是必需的(即輸出大小 $ H $ ) 必須修剪結果。這也可能會產生一些額外的碰撞、前圖像情況。
如果我們看隨機選擇,如果我們假設加法是模數,我們將有經典的生日計算 $ 2^\ell $
此外,出於性能原因,這使用了雜湊函式的雙重呼叫。
- >
創建雜湊
$$ ( (String)(File) ) $$= 雜湊結果
$$ h = H(s_1 \mathbin| s_2) $$如果沒有使用好的分隔符,這具有通常的串聯和通常的碰撞問題;
$$ h = H(\texttt{abcdef} \mathbin| \texttt{zod}) = H(\texttt{abc} \mathbin| \texttt{defzod}) $$減輕輸入中不存在的定界符是首選
$$ h = H(\texttt{abcdef} \mathbin| <delimeter> \mathbin| \texttt{zod}) $$
- >
創建雜湊
$$ (HASH(String)) + (HASH(File)) $$= 雜湊結果
$$ h = H(H(s_1) + H(s_2)) $$這個結構使用三重呼叫。儘管如此,對 3ed 案例的攻擊仍然存在問題,因為最後一個雜湊的輸入沒有改變。 2. >
創建雜湊
$$ ( (HASH(String)) (HASH(File)) ) $$= 雜湊結果
$$ h = H(H(s_1) \mathbin| H(s_2)) $$它與使用三重雜湊函式呼叫的情況 4 具有相同的問題。不過,緩解措施仍然有效。
結論
帶定界符的案例4是這裡的最佳選擇
$$ h = H(\texttt{abcdef} \mathbin| <delimeter> \mathbin| \texttt{zod}) $$