大部分非加密哈希算法的改良,都集中在让哈希速度变得更快更好上。而我们今天文章的主角——SipHash则是个例外,它的提出是为了Hash-Flooding Attack(哈希洪水攻击)问题。下面我们就一起来了解一下SipHash算法。

SipHash算法简介

SipHash是由BLAKE算法的设计者Jean-Philippe Aumasson等人于2012年设计的,它是一类针对短消息设计的伪随机函数族,可用于消息认证,用途一般与MAC算法相似。

SipHash算法通过让输出随机化,能够有效减缓哈希洪水攻击凭借这一点,它逐渐成为Ruby、Python、Rust等语言默认的Hash表实现的一部分。

SipHash算法

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的字节。

  1. 压缩轮的SipRound运算之前,计算:v3⊕=mi
  2. 进行c轮SipRound运算;
  3. 然后计算:v0⊕=mi

终结轮

  1. 终结轮的SipRound运算之前,计算:v2⊕=ff
  2. 进行d轮SipRound运算。

SipHash-2-4算法步骤图示如下:

SipHash算法

SipHash算法的特点

SipHash的哈希值长度为64位或128位,哈希值越长,哈希值碰撞率就越低。

根据 SipHash的设计,使用不同的密钥可以产生不同的哈希值,这可以有效地减少哈希值碰撞的风险。

在常规的哈希表应用中,SipHash64位哈希值的碰撞率通常被认为是非常低的,即使对于大型哈希表,也不太可能出现碰撞。

SipHash 在抗生日攻击方面具有较高的安全性,可以在很大程度上减少哈希碰撞的风险。

SipHash算法


总的来说,SipHash是一种安全、可靠的哈希算法,具有较低的哈希值碰撞率,特别是在使用不同密钥的情况下。因此,在实际应用中,可以使用SipHash来保证数据的完整性和安全性。

免责声明:素材源于网络,如有侵权,请联系删稿。