Collision-Resistance
如何從雜湊中導出密碼?
我想生成一個從雜湊指紋派生的密碼。密碼片語由發音不同的單詞列表中的簡短且人類發音的單片語成。推導是一種單向函式,並且此應用程序可以接受降低針對沖突攻擊的安全性/減少密鑰空間。
例如,考慮到密碼片語的減少的密鑰空間,映射
5a1138375b1c38ab49800911e6e533e2b3e60e314a042c5bca01324dc75bc710
到daycare qualified irregular plastic
並且具有盡可能高的抗碰撞性的函式。對於這個應用程序,是否可以使用以雜湊值作為種子的偽隨機數生成器來選擇密碼片語的單詞?有更好的選擇嗎?
**編輯:**下面是使用基本轉換的視覺化(Mathematica 源),它不是雜湊大小的除數(在這種特殊情況下 $ |wordlist|=5 $ 從 8 位散列派生 3 個字)。
一種可能的解決方案是使用基礎轉換,並使用該基礎的結果“數字”作為字典中的索引。
由於這可能有點過於抽象,所以讓我們使用一些虛擬碼:
words = [] left = hexToNum(hash) base = size(dictionary) while (left > 0) { wordIndex = left % base word = dictionary[wordIndex] words += word left = left / base
雜湊被視為正數。然後使用字典的大小作為基數將該數字轉換為多個數字。每個“數字”(實際上只是介於 0 和字典大小之間的另一個大數)都被視為字典的索引。然後我們只需執行一個簡單的查找並連接找到的單詞。
由於
left
變數具有非常大的數值,您可能必須使用“BigNum”庫(64 位整數太小)。大多數語言或加密 API 將提供一個。為了加快速度,您可能需要尋找一個在單個步驟中執行除法和余數的函式,因為與單獨進行除法和余數計算相比,這將導致更少的 CPU 操作。如評論中所述,不需要 PRNG。PRNG 對於種子擴展很有用,但這似乎不是必需的;似乎只需要*轉換。*由於散列已經分佈良好,您可以使用散列的最左邊字節來使用更少的單詞。