簡(jiǎn)述SipHash算法

大部分非加密哈希算法的改良,都集中在讓哈希速度變得更快更好上。而我們今天文章的主角——SipHash則是個(gè)例外,它的提出是為了Hash-Flooding Attack(哈希洪水攻擊)問(wèn)題。下面我們就一起來(lái)了解一下SipHash算法。

SipHash算法簡(jiǎn)介

SipHash是由BLAKE算法的設(shè)計(jì)者Jean-Philippe Aumasson等人于2012年設(shè)計(jì)的,它是一類針對(duì)短消息設(shè)計(jì)的偽隨機(jī)函數(shù)族,可用于消息認(rèn)證,用途一般與MAC算法相似。

SipHash算法通過(guò)讓輸出隨機(jī)化,能夠有效減緩哈希洪水攻擊憑借這一點(diǎn),它逐漸成為Ruby、Python、Rust等語(yǔ)言默認(rèn)的Hash表實(shí)現(xiàn)的一部分。

SipHash算法

SipHash算法描述

通常具體的SipHash算法表示為SipHash-c-d,其中整數(shù)參數(shù)c和d分別表示壓縮輪數(shù)和終結(jié)輪數(shù)。壓縮輪與終結(jié)輪的輪函數(shù)相同,稱為SipRound。給定128位密鑰k(可能為空)和字節(jié)字符串m,SipHash-c-d返回64位值SipHash-c-d(k, m)。

初始化階段

4個(gè)64位的內(nèi)部狀態(tài)字v_1,v_2,v_3,v_4初始化為:

v0=k0⊕736f6d6570736575

v1=k1⊕646f72616e646f6d

v2=k0⊕6c7967656e657261

v3=k1⊕7465646279746573

其中k0和k1是密鑰k小端編碼的64位字,初始狀態(tài)的常數(shù)對(duì)應(yīng)于大端編碼的ASCII字符串“Somepseudorandomlygeneratedbytes”。

壓縮輪

SipHash-c-d通過(guò)將b字節(jié)的字符串m解析為w=?(b+1)/8?>0個(gè)64位的小端編碼字m_0,m_1,?,m_(w-1),來(lái)處理b字節(jié)字符串m。

注意:m_(w-1)包括m的一些比特、“0”字符串,以及一個(gè)用來(lái)表示b mod 256的字節(jié)。

  1. 壓縮輪的SipRound運(yùn)算之前,計(jì)算:v3⊕=mi
  2. 進(jìn)行c輪SipRound運(yùn)算;
  3. 然后計(jì)算:v0⊕=mi

終結(jié)輪

  1. 終結(jié)輪的SipRound運(yùn)算之前,計(jì)算:v2⊕=ff
  2. 進(jìn)行d輪SipRound運(yùn)算。

SipHash-2-4算法步驟圖示如下:

SipHash算法

SipHash算法的特點(diǎn)

SipHash的哈希值長(zhǎng)度為64位或128位,哈希值越長(zhǎng),哈希值碰撞率就越低。

根據(jù) SipHash的設(shè)計(jì),使用不同的密鑰可以產(chǎn)生不同的哈希值,這可以有效地減少哈希值碰撞的風(fēng)險(xiǎn)。

在常規(guī)的哈希表應(yīng)用中,SipHash64位哈希值的碰撞率通常被認(rèn)為是非常低的,即使對(duì)于大型哈希表,也不太可能出現(xiàn)碰撞。

SipHash 在抗生日攻擊方面具有較高的安全性,可以在很大程度上減少哈希碰撞的風(fēng)險(xiǎn)。

SipHash算法


總的來(lái)說(shuō),SipHash是一種安全、可靠的哈希算法,具有較低的哈希值碰撞率,特別是在使用不同密鑰的情況下。因此,在實(shí)際應(yīng)用中,可以使用SipHash來(lái)保證數(shù)據(jù)的完整性和安全性。

免責(zé)聲明:素材源于網(wǎng)絡(luò),如有侵權(quán),請(qǐng)聯(lián)系刪稿。