跳轉到內容

演算法實現/雜湊

來自華夏公益教科書,開放的書籍,面向開放的世界

雜湊演算法通常分為三個子集

索引演算法
通常用於快速查詢專案,使用稱為“雜湊表”的列表。
校驗和
常用於簡單的資料檢查,以檢測通訊過程中發生的任何意外位錯誤 - 我們在前面一章中討論了它們,校驗和
訊息摘要
一種密碼學安全的單向函式,在計算機安全領域,許多函式的安全性都經過了嚴格的審查。

索引演算法

[編輯 | 編輯原始碼]

Jenkins 一次性雜湊

[編輯 | 編輯原始碼]

來自 Bob Jenkins 在Dr. Dobb's 1997 年 9 月的文章 的“Jenkins 一次性雜湊”。

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 雜湊函式CityHashMurmurHash。可能希望使用帶金鑰的雜湊函式來抵抗 “雜湊氾濫”:現代實現使用 SipHash 來實現此目的;其他使用 “通用”雜湊函式

校驗和與迴圈冗餘校驗

[編輯 | 編輯原始碼]

請參閱 演算法實現/校驗和

訊息摘要

[編輯 | 編輯原始碼]

訊息摘要的最新技術和被認為安全的技術變化頻繁。美國國家安全域性舉辦演算法競賽,並選擇獲勝者作為 SHA,即“安全雜湊演算法”。

  • 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。

雖然這些演算法可以直接從規範中實現,但與其他形式的 密碼學 一樣,使用經過徹底審查的開源庫通常更安全、更快。

進一步閱讀

[編輯 | 編輯原始碼]


參考文獻

[編輯 | 編輯原始碼]
華夏公益教科書