大部分非加密哈希算法的改良,都集中在让哈希速度变得更快更好上。而我们今天文章的主角——SipHash则是个例外,它的提出是为了Hash-Flooding Attack(哈希洪水攻击)问题。下面我们就一起来了解一下SipHash算法。
SipHash算法简介
SipHash是由BLAKE算法的设计者Jean-Philippe Aumasson等人于2012年设计的,它是一类针对短消息设计的伪随机函数族,可用于消息认证,用途一般与MAC算法相似。
SipHash算法通过让输出随机化,能够有效减缓哈希洪水攻击凭借这一点,它逐渐成为Ruby、Python、Rust等语言默认的Hash表实现的一部分。
SipHash算法描述
通常具体的SipHash算法表示为SipHash-c-d,其中整数参数c和d分别表示压缩轮数和终结轮数。压缩轮与终结轮的轮函数相同,称为SipRound。给定128位密钥k(可能为空)和字节字符串m,SipHash-c-d返回64位值SipHash-c-d(k, m)。
初始化阶段
4个64位的内部状态字v_1,v_2,v_3,v_4初始化为:
v0=k0⊕736f6d6570736575
v1=k1⊕646f72616e646f6d
v2=k0⊕6c7967656e657261
v3=k1⊕7465646279746573
其中k0和k1是密钥k小端编码的64位字,初始状态的常数对应于大端编码的ASCII字符串“Somepseudorandomlygeneratedbytes”。
压缩轮
SipHash-c-d通过将b字节的字符串m解析为w=⌈(b+1)/8⌉>0个64位的小端编码字m_0,m_1,⋯,m_(w-1),来处理b字节字符串m。
注意:m_(w-1)包括m的一些比特、“0”字符串,以及一个用来表示b mod 256的字节。
- 压缩轮的SipRound运算之前,计算:v3⊕=mi
- 进行c轮SipRound运算;
- 然后计算:v0⊕=mi
终结轮
- 终结轮的SipRound运算之前,计算:v2⊕=ff
- 进行d轮SipRound运算。
SipHash-2-4算法步骤图示如下:
SipHash算法的特点
SipHash的哈希值长度为64位或128位,哈希值越长,哈希值碰撞率就越低。
根据 SipHash的设计,使用不同的密钥可以产生不同的哈希值,这可以有效地减少哈希值碰撞的风险。
在常规的哈希表应用中,SipHash64位哈希值的碰撞率通常被认为是非常低的,即使对于大型哈希表,也不太可能出现碰撞。
SipHash 在抗生日攻击方面具有较高的安全性,可以在很大程度上减少哈希碰撞的风险。
总的来说,SipHash是一种安全、可靠的哈希算法,具有较低的哈希值碰撞率,特别是在使用不同密钥的情况下。因此,在实际应用中,可以使用SipHash来保证数据的完整性和安全性。
免责声明:素材源于网络,如有侵权,请联系删稿。