算法实现/哈希
外观
< 算法实现
哈希算法通常分为三个子集
- 索引算法
- 通常用于快速查找项目,使用称为“哈希表”的列表。
- 校验和
- 常用于简单的數據檢查,以檢測通信過程中發生的任何意外位錯誤 - 我们在前面一章中讨论了它们,校验和。
- 消息摘要
- 一种密码学安全的单向函数,在计算机安全领域,许多函数的安全性都经过了严格的审查。
来自 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 哈希函数、CityHash 和 MurmurHash。可能希望使用带密钥的哈希函数来抵抗 “哈希泛滥”:现代实现使用 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。
虽然这些算法可以直接从规范中实现,但与其他形式的 密码学 一样,使用经过彻底审查的开源库通常更安全、更快。
- 请参阅 数据结构/哈希表,了解哈希最常见的应用。
- 微软 FCIV(文件校验和完整性验证器)
- 从 VBA 运行 FCIV 实用程序
- VBA 中的字符串哈希
- VBA 中的文件哈希