Hash

是否有任何已知值用於已知沒有原像的常見散列

  • February 20, 2018

在要求使用者擁有密碼的系統中,作為一種快速解決方法,我將隨機垃圾作為 bcrypt 散列寫入,這樣任何人都無法登錄該使用者。然而理論上可能有一個與這個隨機選擇的雜湊值匹配的密碼。

我想知道在這種情況下是否有可能專門製作一個雜湊值(可能使用除 bcrypt 之外的不同支持的算法),它可以保證沒有原像。

對於 bcrypt,我懷疑這是不可能的,因為如果我的數學是正確的,那麼沒有 75 字元密碼原像的預期雜湊數是 (1/e)^(2^416) 也稱為 0。

但也許對於另一種常見的密碼散列算法,這些值不僅是預期的,而且還有一種方法可以找到這樣的值。

眾所周知的雜湊函式有任何“不可能的”輸出值嗎?. 加密雜湊通常沒有足夠的數學結構來討論諸如特定值具有的原像數量之類的事情。您可以更好地分析一些非加密雜湊,如 CRC32,因為它們具有如此多的數學結構。一般來說,統一覆蓋整個域是一個設計目標,因此您所詢問的屬性將被視為一個弱點。

當然,使用您正在尋找的屬性設計雜湊並不難。給定任何散列函式 $ h(x) $ 你可以定義

function H(x) {
   var count = 0, result = 0;
   do {
       result = h(x . count);
       ++count;
   }
   while (result == 0);
   return result;
} 

本質上,您只是在任何時候返回“保留”值時重新散列。

綜上所述,從工程角度解決此問題的典型方法是使用絕對超出可能值集的值,例如 NULL。這樣做的好處是它可以在更改散列函式後倖存下來。

引用自:https://crypto.stackexchange.com/questions/46896