題:
在使用靜態鹽進行足夠的迭代之後,是否所有哈希都不會衝突?
Undo
2014-06-24 04:53:28 UTC
view on stackexchange narkive permalink

我們都知道我們應該採用一種相當慢的哈希算法,對密碼加鹽,然後對許多迭代運行哈希。假設我遵守了除一條規則之外的幾乎所有內容,並且我有一個靜態鹽。像這樣的東西:

  password ='yaypuppies'+ some_static_salt1000.times do password = amazing_hash(password)end  

現在是 password 代碼>是一件很棒的雜亂無章的事情。

但是如果我們進行更多次迭代會怎樣?

  3000000000000000000.times do#3 quintillion password = amazing_hash(password)end  

從理論上講,許多密碼會發生衝突嗎?即會出現這種情況?

  PASS1 -> lkajsdlkajslkjda > 23oiuolekeq > N,mznxc,mnzxc > common_thing > 987123oijd > liasjdlkajsd > 09893oiehd > 09uasodijpass2 -> loiuoklncas > 9830984cjlas > ioasjdknckauyieuh > common_thing > 987123oijd > liasjdlkajsd > 09893oiehd > 09uasodij  

並且兩個密碼最終都散列為 09uasodij

使用非隨機化的每次輸入密碼的鹽,每次添加迭代都會增加碰撞的可能性?

對於密碼哈希,現代算法中的哈希衝突不被視為問題。
您可能會對彩虹表的工作方式感興趣,因為它們基於的概念與您對鏈的誤解有些相似。
這個問題似乎是在詢問哈希算法輸出空間中的兩個不同字符串是否可能哈希為相同值。我懷疑對於大多數算法來說,這至少接近真實。當且僅當x和y都不在h的輸出空間中時,才可能對不同的x,y使用h(x)= h(y)。
@LucasKauffman是的。因為沒有人將密碼哈希二十億次。如果我們大幅增加該數字怎麼辦。如果我們(理論上)經歷了格雷厄姆的迭代次數該怎麼辦?如果任何兩個哈希(在算法的輸出空間中為字符串)可以哈希為相同的值,則很有可能最終會導致所有相同的哈希。
-1
@LucasKauffman這是一個非常理論性的問題。顯然不切實際
我想最好將其轉移到加密貨幣上
鹽可以這樣使用:`而當我<3000000000000000000 // 3五百萬個hash = amazing_hash(hash。salt。password)end`時,如果兩個不同密碼的哈希值在某個時候發生衝突,則該哈希值將用於下一次迭代會有所不同
八 答案:
Tom Leek
2014-06-24 17:45:12 UTC
view on stackexchange narkive permalink

在迭代哈希函數時,會發生空間縮減,但不會減少到一點。對於具有 n 位輸出的隨機選擇的函數(應該讓您的“ amazing_hash”接近),您可能最終希望達到一個大小為 2 n /的循環。 2 sup> 左右,即如果您使用適當的輸出大小(例如, n = 256 ),該大小仍然足夠。

請參見 this答案以獲取更詳細的說明。我在此從該答案中重現該方案,因為它很引人注目:

The "rho" diagram for an iterated hash function

當然,是“靜鹽”不是鹽這僅表示您正在使用自定義哈希函數。鹽是用來阻止並行攻擊的:當攻擊者嘗試破解10個密碼時,其成本是破解一個密碼的10倍。使用“靜態鹽”,破解10個密碼的成本不超過破解1的成本,即破解完全失敗。

鹽並不是要避免衝突,特別是因為衝突不是問題用於密碼哈希。您應該擔心的是原像抵抗。

嚴格來說,“靜態鹽”並不是鹽的“全部”失敗。攻擊者至少不能與使用其他靜態鹽的其他站點並行地攻擊您的站點,或在架子上使用彩虹表。
我認為更大的問題是,即使以所有2 ^ 128個不同的128位向量的完整集合,並將它們反复通過隨機映射,衝突的數量將隨著不同向量的數量而迅速下降。例如,當向量的數量下降到2 ^ 120時,每次迭代將僅損失其中的1/256。當它下降到2 ^ 100時,每次迭代只會損失大約1 / 268,000,000。從理論上講,如果一個人在每次迭代中使用不同的隨機映射,則可能“最終”將所有起始向量映射為一個值。
...但是發生衝突的速度將顯著下降,以至於當一次下降到2 ^ 64個值時,每次迭代只會丟失大約一個可能的值(在2 ^ 64個值中),而不會在每個損失的值開始平均進行一百萬次迭代之前,不必做太多的事情。
Neil Fitzgerald
2014-06-24 05:16:58 UTC
view on stackexchange narkive permalink

我不這麼認為,只是因為散列幾乎可以肯定在不同點到達“ common_thing”。一個密碼在步驟10,000可能必須“ common_thing”,而另一個密碼在步驟100,000。鏈條可以並行跟踪彼此,但是算法結束時它們不一定位於同一點。

無論周期是大還是小,概率仍然很低。如果有許多小循環,則在其中任何一個特定循環中都不太可能有一個值。如果存在幾個大周期,則該值不太可能在同一點終止鏈。

正如其他人所說,不使用靜態鹽的原因是為了防止攻擊者創建彩虹表。我不確定靜態鹽是否會隨時間推移而影響碰撞次數,當然,相同的值會散列為相同的值。雖然;我是加密貨幣愛好者,但不是專家。如果其他人對該領域了解更多,我希望能聽到更多有關哈希算法循環的信息。

您帖子中的建議似乎表明,多個哈希最終可能會達到“ common_think”。用現實世界的數據證實這一點將是很好的。
我不確定你是什麼意思。假設您有一些鏈,其中h(x)= y,h(y)= z。如果將h重複適當的次數,顯然x和y都將哈希到z。另外,如果您的意思是,是否可以存在不同的x和y,使得h(x)= h(y),那也是肯定的。那是一種衝突,所有哈希函數都具有它們,因為它們會將很大的字符串空間減小為較小的字符串。
當然。但是,問題是,當您使用帶有兩個不同哈希值的兩個密碼開始時,您最終會遇到這種情況的可能性如何。 SHA256具有10 ^ 77的可能性,我正在努力如何將具有兩個不同哈希值的兩個不同密碼在10,000或100,000次迭代中衝突。那將是一個很弱的哈希函數,不是嗎?
@OmerIqbal它們是任意數字,用以說明一個觀點。即使他們都在迭代過程中的某個時刻成為“ common_thing”,他們也可能不會產生相同的結果,除非它在相同的迭代中發生兩種情況。
我一直認為,“ t”比“ h(t)”具有更多可識別的信息是對的,但是我意識到我不知道為什麼我相信這一點,因此無法立即找到關於主題。但是,如果在所有情況下`information(t)> = information(h(t))`,那麼最終您將獲得0位唯一信息。但是我不是密碼學家,我只是對該領域有足夠的了解,所以我對此一無所知。
“哈希將在不同點到達“ common_thing”。”您怎麼知道的?您是否聲稱不可能將2個不同的哈希值哈希到相同的值?
@Cruncher Example:`h(a)=> b`,`h(b)=> c`,`h(c)=> a`; `h(1)=> a`,`h(2)=> b`;它們都散列為相同的值,但迭代次數不同。
@Cruncher對不起,我的意思可能是這樣,並非絕對如此。儘管當然有可能,但伊茲卡塔的案子比他們在同一時間爭取相同價值的可能性更大。
@Izkata我明白了。我知道這是可能的,而且顯然更有可能。但是如果是的話,h(a)=> bh(b)=> ch(c)=> d`和h(e)=> fh(f)=> gh(g)=> d`是不可能的/不,你怎麼知道?那是`h(h(h(h(a)))= h(h(h(e())))`但是`h(a)!= h(e)`
好的,我明白您的要求了!對困惑感到抱歉。好吧,也許吧,也許不是。首次使用h後,您將輸入空間減少到輸出空間。散列空間中的每個值都有可能映射到散列空間中的不同值,在這種情況下,您實際上不會遇到這種衝突。
@NeilFitzgerald是的,我的意思是2個不同的哈希散列為相同的值(也許混淆,因為我既使用散列作為動詞,又使用名詞來表示哈希算法輸出空間中的某些東西)。 “散列空間中的每個值都有可能映射到散列空間中的不同值”,這就是我很好奇的。無論是否發生碰撞,您都必須在輸出空間之外冒險。可能是特定於算法的,但是看起來這將是一個不錯的屬性。
實際上,如果確實發生了這種衝突,則意味著在輸出空間中存在一些值y,從而在輸出空間中沒有x,因此h(x)= y。 (對不起,這是一口)。哈希的標準密碼學特性(抗原像性,抗碰撞性)均無法確認或否認。
是的,我想我對此一無所知。我同意這很有趣,但是我對單個哈希函數的實現知之甚少。抱歉!我也想知道。
只能從輸出空間外部散列到的@NeilFitzgerald哈希聽起來也很有趣!
rolfl
2014-06-24 05:07:45 UTC
view on stackexchange narkive permalink

與靜鹽有關的問題不是碰撞的可能性增加了(沒有)。只要所有密碼具有相同的迭代次數,重複運行相同的算法就不會增加衝突(具有良好的哈希功能)。

真正的問題是賠率遊戲。

如果攻擊者知道用於生成哈希密碼的代碼(用於注入鹽的機制以及通過哈希循環的迭代次數),則攻擊者可以重現您的算法。假設攻擊者也知道您的實際哈希結果。他們可以算出您的實際密碼嗎​​?

使用該算法,攻擊者可以將常用密碼詞典輸入該算法,並查找與您的哈希結果匹配的內容。誠然,可能要花很長時間,但最終攻擊者可能會猜出您的密碼。系統中的其他內容。您的哈希密碼只是眾多密碼之一。如果站點是“堆棧交換”,則有成千上萬的用戶。如果他們都使用相同的鹽,那麼像這樣的字典攻擊可以針對所有用戶的哈希密碼檢查匹配情況。如果他們匹配,那麼他們也已經猜到了該用戶的密碼。這是一個數字遊戲。如果系統中有10,000個用戶,那麼查找簡單密碼的機率將提高10,000,可能遠遠超過該數字。

現在,如果您為每個用戶使用唯一的鹽,則將獲得匹配除非該用戶也具有與算法中相同的鹽,否則該用戶的哈希將毫無用處。

換句話說,使用唯一的鹽,您一次只能攻擊一個用戶帳戶。有了靜鹽,您可以立即攻擊它們。...擊中的機會更大。

Matt Nordhoff
2014-06-24 08:18:13 UTC
view on stackexchange narkive permalink

理論上,是的,對於“很多”和“很多”的足夠定義,這肯定會發生。實際上,不,那將永遠不會發生。安全的密碼散列函數的要點是“很多”和“很多”是無法達到的荒謬數字。如果可以達到目標,則可能是對該算法造成了嚴重的攻擊,您不應該使用它,或者它不夠大,也不應該使用它。

例如,以MD5為例。哈希長度為128位。理想情況下,平均來說,您應該發現2次嘗試 64 sup>發生一次碰撞,即大約18百萬次。這將是非常昂貴的,但可能需要足夠的硬件。但是,MD5遭受了密碼分析的災難性打擊,有些攻擊可以在一瞬間發現衝突。

另一方面,還有SHA-256。它是256位-無法計算2 128 sup>哈希,並且沒有針對它的顯著攻擊。

因此,如果您使用的是像SHA-256或SHA-512這樣的散列。即使您不在,也不必擔心。我想不出為什麼用戶會嘗試創建一個有意引起衝突的密碼,並且使用大量的迭代是不切實際的,除非您希望用戶登錄需要數十年的計算時間。

從本質上講,我的問題是:使用非隨機化的每密碼鹽,每發生一次碰撞的機會是否都會增加是的,它確實做到了,從“如此接近零將永遠不會發生”到“仍然如此接近零將永遠不會發生”。

“我想不出為什麼用戶會嘗試創建有意引起衝突的密碼,……”用戶不會。關鍵是,如果弗雷德的密碼為“ confused.cow.carburetor.paperclip”,並且如果“ 1234567”的哈希值與“ confused.cow.carburetor.paperclip”相同,則攻擊者可以使用該密碼登錄弗雷德的帳戶。密碼“ 1234567”。
Steve Jessop
2014-06-24 13:25:31 UTC
view on stackexchange narkive permalink

就理論而言,函數 amazing_hash 的每個輸出都有固定的大小,並映射到哈希函數的另一個輸出以及另一個,依此類推。

因此,除了第一個輸入之外,您還具有一個從有限集到其自身的函數。該函數可以是雙射的,也可以不是雙射的,但是它不是哈希函數的必需屬性。函數的域必要地分為:

  • 一個或多個循環,加上
  • 零或多個“尾巴”,即表示導致一個循環或另一尾的序列。當兩條尾巴連接在一起時,可以認為哪一條先導到另一條是任意的,但是稍後我將使用尾巴的數量,因此必須這樣定義:-)還可以定義一條尾巴的“末端”

每個點在進行迭代時都屬於循環的一部分,或者跟隨於一條尾巴,而尾部則成為一條尾巴加入,直到加入一個循環。這是函數從有限集到其自身的必要屬性。路徑不能永遠運行而不會進入循環,因為只有有限的多個值,因此最終必須重複一個。因此,您可以在視覺上將功能想像成很多圓圈,樹枝從側面伸出來。分支都通向圓。

一次迭代(即在初始哈希之後再哈希一次),有多少個碰撞?好吧,這與尾巴的數量有關,因為尾巴的末端是兩個不相等的值具有相同哈希值的地方。每個連接點都意味著存在多個碰撞值,該值等於該點處連接的結構的數量。每個尾巴都以連接結尾,因此,如果我們仔細定義“尾巴”和“碰撞”,則碰撞次數就是尾巴的數量。

兩次迭代後,有多少次碰撞?它是尾部的數量(因為兩個值發生碰撞,它們保持碰撞), plus 是額外迭代導致的新碰撞的數量。如果連接點的“兩側”至少有2個節點長,則額外的迭代會導致衝突。因此,在兩條尾巴連接的地方,它們都必須至少有2個節點長;在一條尾巴連接的循環中,它必須至少是2個週期。

在n次迭代之後,尾部在

在極端情況下,雙射的散列函數沒有尾巴。這是定理的有限函數之一:每個排列將其域劃分為多個循環。然後應該很容易看出,無論您進行了多少次迭代,都不會發生 no 衝突(當然,不是由初始哈希引起的那些衝突)。每個點都圍繞其周期移動。通過使每個點在一個循環中移動相同數量的步,它們仍然都處在不同的位置。

否則,以您執行的迭代次數越多,碰撞越多在尾部合併到循環中時生成。但是,此過程有一個上限,因為每個尾部和每個週期都有一個有限的長度。最終,當您進行更多的迭代時,將不會引起更多的碰撞。直到您達到函數中最長的尾巴的長度,這種情況才會發生。

從理論上講,這都是所有的:實際上,最長的尾巴可能仍然比您有足夠的時間進行迭代。如果這樣的話,只要您能實際運行,就將不斷增加碰撞次數。

但是,與哈希空間相比,每次迭代引入的衝突數量仍然很小,以至於您以這種方式遇到衝突的可能性極小。我們怎麼知道呢?因為如果不是這樣,則弗洛伊德(Floyd)的循環查找算法將是在哈希函數中查找衝突的有效方法。根據問題的假設,哈希函數不會“令人驚奇”,它會被破壞:-)

Omer Iqbal
2014-06-24 05:05:44 UTC
view on stackexchange narkive permalink

從理論上講,許多密碼會發生衝突嗎?

在您的示例中,您看到的是兩個輸入獲得相同輸出的難易程度作為碰撞。這是密碼學中的一個重要領域,用於評估算法的強度,並且每個算法都不同。

即使在您的示例中,迭代次數也無關緊要,因為有趣的是以下內容:

  hash(n,mznxc,mnzxc)> common_thing哈希(ioasjdknckauyieuh)> common_thing  

由於要獲取哈希的輸出,然後將其作為輸入推回,因此輸入和輸出的大小相同(除了第一個輸入)

已知算法(例如 MD5)顯示了一些衝突漏洞。即使在發明MD5作為安全替代 MD4時,也已經在火焰病毒中利用了MD5衝突。因此,密碼學依靠對大量密碼學家的審查和研究來找出哪些算法尚未顯示出任何弱點。

因此,在任何時間點,您都必須查看哪些哈希函數沒有任何已知的漏洞,請設計您的系統,以便將來可以轉換哈希函數(即,加密敏捷)。

使用非隨機密碼鹽,每次添加迭代都會增加碰撞的機會嗎?

非隨機鹽不能解決此問題。他們解決了彩虹表和密碼衝突的問題(即,如果兩個用戶具有相同的鹽,相同的密碼和相同的迭代次數,則將獲得相同的哈希值。)從設計角度來看,您必須假設鹽和迭代次數是眾所周知的(即使您設法將其隱藏)。

鑑於許多用戶共享相同的密碼(“ 123456”,“ password”,“ abcdefgh”等),並且具有非隨機鹽和迭代,因此使用頻率分析預測密碼變得容易得多>由於密碼相同而產生的哈希值相同。

Ry-
2014-06-24 11:04:33 UTC
view on stackexchange narkive permalink

因此,簡單地說:在N次迭代之後,輸入A和輸入B散列到同一事物的機率是多少? (鹽對此不會有任何改變。)由於H(A)和H(B)應該均勻地隨機分佈以獲得良好的哈希函數,因此這與H(A)和H(B)的機率大致相同)不相撞的次數H(A)和H(B)不相撞的機率在經過N-1個回合後就不會發生衝突。對於具有2 256 sup>可能輸出的SHA-256(理想情況下),這是1 −((2 256 sup> − 1)/ 2 256 sup>) N sup>≈2.59×10 −59 sup>進行3億次迭代。

不太可能。

您還可以估算但是,正如其他答案也提到的那樣,進入其他答案提到的與生日問題近似的循環,除非兩個輸入在此循環中同步,否則不會引起衝突。

對於SHA再次執行-256和3×10 18 sup>迭代,即1 − e -((3×10 18 sup>) 2 /(2×2 256 sup>) sup>≈3.89×10 −41 sup>。

也不太可能。

Damon
2014-06-24 17:46:13 UTC
view on stackexchange narkive permalink

否。

都是關於熵的。

給出一個“不間斷的”密碼哈希函數,它會產生 N 位偽隨機輸出,用於長度為 M 的任何輸入,只不過是從這M個比特中提取 N個熵而已。 1 sup>
當然這僅是如果 M > = N ,則可以以合理的方式工作,因為如果輸入根本不包含熵,您幾乎就無法提取 N 位熵。

碰撞的可能性由著名的生日悖論來描述(具有諷刺意味的是,它與實際的根本不起作用,因為它們的分佈非常不均勻!)。
用戶選擇相同的密碼要高得多。或換句話說,用戶密碼(甚至是一個相對不錯的密碼)中包含的熵太糟糕了。

鹽將熵添加到輸入中。這意味著與普通密碼相比,使用靜態的第一次迭代(我假設“靜態”仍然表示“每個用戶”!)實際上減少了​​發生衝突的可能性。

現在,在第二,第三和第 ith 次迭代?哈希函數將上一輪的輸出作為輸入,其中包含 N 位熵(它已經包括了靜態鹽中的熵,因此再次添加鹽仍將其保留為 N ),並輸出熵的 N 位。
CPU旋轉,位翻轉,數字看起來有所不同,但是就熵或碰撞可能性而言,什麼都沒有改變。

N 位, N 位。

因此,它不會變得更糟(但也不會變得更好)。


1 sup>例如,這是DJB背後的原因,告訴您將您從curve25519函數獲得的密鑰散列幾次(除了使對EC的攻擊更加困難之外)。該曲線具有約的力量128位,該函數輸出32字節的字符串。這意味著您具有256個“隨機查找”位的斑點,內部只有128位實際熵,但是您不知道它在哪裡。您使用哪些位?將256位哈希為128位可以很好地解決該問題,而不必冒著丟掉有用位的風險。


該問答將自動從英語翻譯而來。原始內容可在stackexchange上找到,我們感謝它分發的cc by-sa 3.0許可。
Loading...