相同的字元串是否總是具有相同的 SHA-256 值?
如果您在電腦上使用 SHA-256 對字元串進行雜湊處理,而我在電腦上使用 SHA-256 對相同的字元串進行雜湊處理,我們會生成相同的值嗎?該算法是否依賴於種子(所以我們都需要相同的種子)或其他一些此類參數?
編輯: 為了澄清,“字元串”我的意思是“相同的字節輸入”,正如評論和@ispiro的回答所指出的那樣,對於相同的字元串,根據編碼可能會有所不同。
是的,如果您使用相同的函式散列相同的輸入,您將始終得到相同的結果。
這是因為它是一個散列函式。根據定義,函式是一組輸入和一組允許輸出之間的關係,其屬性是每個輸入都與一個輸出相關。
在實踐中,評估雜湊函式不涉及種子。
現在,這就是事情在實踐中的運作方式。在理論上,我們經常談論雜湊函式族。在這種情況下,確實存在一個選擇我們正在使用的家庭成員的鍵。其原因是碰撞阻力定義的技術問題。
單個散列函式的抗碰撞性的樸素定義 $ H : {0,1}^* \to {0,1}^n $ 將是所有有效算法 $ \mathcal{A} $ 以下機率可以忽略不計
$$ \Pr[(x_1,x_2)\gets\mathcal{A}(1^n): H(x_1)=H(x_2)] $$ 問題在於,這是不可能實現的。鑑於 $ H $ 正在壓縮,碰撞必然存在。所以一個算法 $ \mathcal{A} $ 只是將其中一個碰撞硬編碼並輸出它,有
$$ \Pr[(x_1,x_2)\gets\mathcal{A}(1^n): H(x_1)=H(x_2)] = 1. $$ 所以這個定義是無法實現的,因為這 $ \mathcal{A} $ 根據定義存在,即使沒有人可能知道它是什麼。 為了解決這個問題,我們定義了一系列雜湊函式的抗碰撞性 $ {H_k : {0,1}^* \to {0,1}^n}_k $ . 然後我們定義這樣一個家庭是抗碰撞的,如果它認為以下機率可以忽略不計
$$ \Pr_{k\gets{0,1}^n}[(x_1,x_2)\gets\mathcal{A}(k): H_k(x_1)=H_k(x_2)]. $$ 在這裡我們不會遇到同樣的問題,因為確切的功能 $ \mathcal{A} $ 需要從指數級大的家庭中隨機均勻地選擇碰撞。自從 $ \mathcal{A} $ 最多可以對族中的多項式函式進行硬編碼衝突,這樣的雜湊函式族並非完全不可能。
請注意,這意味著散列函式的理論處理與其實際使用之間存在某種脫節。