SipHash 快速哈希算法 与 WASM

本文介绍了SipHash算法,它是由JP Aumasson和Daniel J Bernstein (djb)共同设计的一种快速哈希算法,旨在解决哈希表在面对拒绝服务(DoS)攻击时的脆弱性。SipHash通过密钥哈希的方式,在保证速度的同时,提供了较好的安全性,尤其适用于网络应用和WebAssembly (WASM)等场景,且比HMAC更快。

JP Aumasson [ here] 和 Daniel J Bernstein (djb) [ here]

SipHash 和 WASM

最优秀的两位网络安全研究员分别是:JP Aumasson [ here];以及 Daniel J Bernstein (djb) [ here]。JP 以共同创建 BLAKE2 [ here] 和 BLAKE3 快速哈希方法,以及共同创建 GPU 破坏性哈希方法 Argon 2 而闻名。对于 djb,我们看到了长期的创新,包括创建 ChaCha20、Salsa20 和 Curve 25519。

大约在 2011/2012 年,JP Aumasson 和 Daniel J Bernstein (djb) 实际上合作识别了现有哈希方法的一些主要风险 [ here]:

为此,JP 和 djb 概述了如何通过向服务器发送相同的哈希(多重冲突)来在哈希表上创建 DoS(拒绝服务)。这会导致最坏情况下的插入时间,并可能导致针对哈希方法的 DoS。给出的示例是发送 2MB 的 POST 数据,其中包含 200,000 个相同的 10 字节字符串,这会导致 40,000,000,000 次字符串比较 —— 对 2 GHz 机器的计算时间产生大约 10 秒的影响。他们发现 MurmurHash2/3 和 Google 的 CityHash 容易受到这些攻击。此后,Google 发布了 FarmHash 以解决此弱点。

但对于 JP 和 djb 来说,这不仅仅是概述弱点,而是他们如何使用 SipHash [1] 解决问题。这解决了 DoS 攻击对哈希方法造成的一些问题 [ here]:

它包含以下大胆声明:

“我们建议哈希表切换到 SipHash 作为哈希函数。”

总的来说,SipHash 是一种基于密钥的哈希函数,我们可以使用密钥来生成无法逆转的哈希值。因此,哈希是从密钥 ( K_in) 生成的,得到 SipHash( D_in, K_in)。如果没有密钥的知识,将极难确定输入数据值。

SipHash 被认为是周围最好的非密码学哈希之一,并且通常没有安全问题。它使用树哈希方法,我们首先分解输入数据,然后在树结构中将这些哈希在一起,最终提供根哈希值。SipHash 使用英特尔的 SIMD(单指令多数据)扩展,并使用 16 个 SIMD 寄存器来执行快速乘法。总的来说,与 SipHash 一样,它是一种 密钥哈希 方法,我们可以应用密钥来扩展给定输入的可能哈希范围。SipHash 使用 128 位密钥进行哈希。总的来说,对于 MAC,SipHash 比 HMAC 快得多。

Siphash

SipHash 生成一个哈希函数,该函数针对短消息的速度进行了优化。它通常用于网络应用程序,并且比加密哈希方法更简单。它产生一个 64 位输出,并且可以产生 Gigahashes/秒。它不如 xxHash 快,但比 MD5 和 SHA-1 快得多。一个示例运行是 [ here]:

======Siphash=========
Key:        0123456789ABCDE0
Message:    hello
Hash:       10442178880121868220

Siphash 的性能相当不错,但远不如 xxHash64 Cityhash64, Spooky 和 Farm64 快:

参考文献:[ here]

SipHash 和 WASM

WebAssembly (WASM) 的使用支持在浏览器中进行超快执行,并且汇编语言代码实际在客户端机器上运行。

其中一个实现是 libsodium.js,它是编译为 WASM(WebAssembly)的 sodium 加密库,并使用与 Python 端口相同的 sodium 方法。libsodium 可以创建一个 MAC(消息验证码),它获取消息的哈希并应用一个密钥。为此,Sodium 使用 SipHash-2-4 哈希,这在创建能够抵抗哈希冲突拒绝服务攻击(Hash-DoS)的哈希表时非常有用。在这种情况下,我们将生成一个 8 字节(64 位)哈希值,这是哈希表中使用的典型值。总的来说,SipHash 比加密哈希快得多。

JavaScript 中的代码是 [ here]:

let key = window.sodium.randombytes_buf(16);
const message = document.getElementById("message").value;
var msg = window.sodium.from_string(message);
var h = toHex(window.sodium.crypto_shorthash(msg, key));
document.getElementById('MAC').innerText = h;
document.getElementById('key').innerText = toHex(key);

在此尝试:https://asecuritysite.com/webcrypto/crypt_hash3

  • 原文链接: billatnapier.medium.com/...
  • 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
billatnapier
billatnapier
江湖只有他的大名,没有他的介绍。