Password-Hashing
尋找基於編碼的碰撞
例如,如果我以英語輸入範例“hello world”,那麼雜湊協議通過將文本編碼為二進製字元串來生成雜湊。
如果我在印地語或中文等其他語言中找到一個與英語單詞具有相同結果的單詞,那麼我們有相同的雜湊值怎麼辦?
- 如何查找基於編碼的衝突?
散列協議如何生成它的散列?
雜湊函式採用比特串。他們不關心這些字元串對使用者有什麼意義,所以它不關心這些位是否可以解釋為一些印地語單詞或一些英語句子。
這也意味著您需要將文本映射(稱為“編碼”)到二進製字元串。
- ASCII 是經典的一種,但它只能將大約 100 個字元映射到字節,它也不能用於例如德語、法語或印地語文本。
- UTF-8 是現代經典之一。它使用 1 個字節來表示 ASCII 字元,並根據需要使用盡可能多的字節來表示更大的 Unicode 程式碼點。
- UTF-16 類似於 UTF-8,但預設為基本上所有實際相關的字元/程式碼點使用 2 個字節,其餘部分使用 4 個字節。
- UCS-2 與 UTF-16 類似,但有時不是 2 個字節,有時是 4 個字節,它放棄了對更高程式碼點的支持,並且始終為 2 個字節。
- UTF-32 / UCS-4 總是使用 4 個字節並且可以表示任何 Unicode 字元。
您可能需要注意,Unicode 是一種本質上將數字(=“程式碼點”)分配給字元符號的標準。它本身並沒有規定如何將這些數字編碼為二進制。
您可能還需要注意,不同的系統(作業系統、程式語言和數據庫系統以及其他文本處理系統)可能在編碼上有不同的預設值。
那麼我們有可能得到從不同文本生成的相同雜湊結果嗎?
假設你的散列函式不是完全壞的,比如MD5,那麼這只有在你對不同的語言使用不同的編碼(例如那些早於unicode的編碼)並且它們以某種方式生成相同的字節序列時才有可能。