演算法實現/雜湊
外觀
雜湊演算法通常分為三個子集
- 索引演算法
- 通常用於快速查詢專案,使用稱為“雜湊表”的列表。
- 校驗和
- 通常用於簡單的資料檢查,以檢測通訊過程中的意外位錯誤——我們在之前的章節中討論過它們,校驗和。
- 訊息摘要
- 一種密碼學安全的單向函式,許多在計算機安全領域被仔細檢查其安全性。
“Jenkins 一次性雜湊”,來自 Bob Jenkins 在 1997 年 9 月《Dr. Dobb's》雜誌上的一篇文章。
C
uint32 joaat_hash(uchar *key, size_t key_len) {
uint32 hash = 0;
size_t i;
for (i = 0; i < key_len; i++) {
hash += key[i];
hash += (hash << 10);
hash ^= (hash >> 6);
}
hash += (hash << 3);
hash ^= (hash >> 11);
hash += (hash << 15);
return hash;
}
Java
int joaat_hash(byte[] key) {
int hash = 0;
for (byte b : key) {
hash += (b & 0xFF);
hash += (hash << 10);
hash ^= (hash >>> 6);
}
hash += (hash << 3);
hash ^= (hash >>> 11);
hash += (hash << 15);
return hash;
}
參見 資料結構/雜湊表#選擇一個好的雜湊函式 瞭解有關“Jenkins 一次性雜湊”的更多詳細資訊。
其他流行的雜湊表雜湊函式包括:其他 Jenkins 雜湊函式,CityHash 和 MurmurHash。可能需要使用帶金鑰的雜湊函式來抵禦 “雜湊氾濫”:現代實現使用 SipHash 用於此目的;其他使用 “通用”雜湊函式。
參見 演算法實現/校驗和。
訊息摘要的最新技術以及被認為安全的技術經常變化。美國國家安全域性舉辦演算法競賽,並選擇獲勝者作為 SHAs,“安全雜湊演算法”。
- MD5 (RFC 1321) 及其前身 MD2 和 MD4 都已破譯。它們現在都已過時且不安全。
- SHA0/SHA1 (FIPS-180-1) 部分破譯。自 2005 年以來,它們已過時,被認為不安全,無法抵抗資金雄厚的對手。
- SHA-2 尚未被認為被破譯,但容易受到長度擴充套件攻擊。
- SHA-3 (Keccak) 不容易受到長度擴充套件攻擊。
- KangarooTwelve 是 Keccak 的一個高度並行化的版本(因此非常快)。它沒有經過國家安全域性的審查,但作者認為它與 SHA-3 一樣安全。
- BLAKE 是一種雜湊函式,它進入了 SHA-3 競賽的決賽階段。BLAKE2b 變體被廣泛使用,被認為是安全的(截至 2020 年)。它還具有一個高度並行化的版本,稱為 BLAKE3。
雖然這些演算法可以直接從規範中實現,但與其他形式的 密碼學 一樣,通常使用經過徹底審查的開源庫更安全、更快速。
- 參見 資料結構/雜湊表,瞭解雜湊最常見的應用。
- 微軟 FCIV(檔案校驗和完整性驗證器)
- 從 VBA 執行 FCIV 實用程式
- VBA 中的字串雜湊
- VBA 中的檔案雜湊