Hash

比較具有不同鹽的兩個雜湊

  • July 23, 2013

我將信用卡號的加鹽雜湊儲存在數據庫中。我想做的是確定同一個數據庫中的兩個不同條目是否對應同一張信用卡。

具體來說,讓 $ C_1 $ 和 $ C_2 $ 是兩個信用卡號(可能相同也可能不同)。讓 $ S_1 $ 和 $ S_2 $ 是兩種不同的鹽。如果 $ H_1 = hash(C_1, S_1) $ , 和 $ H_2 = hash(C_2, S_2) $ ,我需要一個函式, $ f $ , 這樣 $ f(H_1, S_1, S_2) = f(H_2, S_1, S_2) $ 當且僅當(以非常高的機率) $ C_1 = C_2 $ .

這可以安全地完成嗎?

可能的解決方案

我的一位密碼學家朋友提出了以下建議:

讓 $ h(C, S) = g_1^{h_t(C)}g_2^{S} $ 反對 $ p $ , 在哪裡 $ C $ 是信用卡號, $ h_t(C) $ 是一個“傳統”的散列函式,並且 $ g_1 $ 和 $ g_2 $ 是滿足 Diffie-Hellman 要求的生成器,並且 $ p $ 是對應的素數。

如果我們這樣做, $ f(H_1, S_1, S_2) = H_1g_2^{S_2} $ 具有所需的屬性。

幾個問題:

  1. 這看起來安全嗎?
  2. 如果我使用像Bouncy Castle 庫這樣的庫來選擇 $ p $ , $ g_1 $ , 和 $ g_2 $ ,對非密碼學家進行編碼是否安全?換句話說,對於非密碼學家來說,以一種不明顯的方式搞砸實現有多容易?
  3. 與下面提出的其他兩個解決方案相比,此方案的優點或缺點。我傾向於這樣做,因為我熟悉 Diffie-Hellman,而其他涉及一些我不熟悉的技術。此外,我懷疑 Diffie-Hellman 有更多的庫,因為它既古老又流行。

好吧,正如其他人所說,您將無法使用標準的加鹽雜湊函式。

但是,如果您使用專門設計的雜湊函式(允許進行這種特定比較),那麼這是可能的。

這是一個概念驗證的想法,以表明它是可能的:

  • 認為 $ N $ 是一個很大的未知因式分解的複合數
  • 讓我們的雜湊函式為 $ h( C, Salt ) = hash(C) ^ {2hash(Salt)} \bmod N $ (在哪裡 $ hash $ 是一個將字元串轉換為大整數的函式,以一種不同字元串的雜湊沒有明顯關係的方式)。因素 2 是為了防止雅可比符號 $ h(C, Salt) $ 從洩露任何資訊。

這個散列函式是單向的,因為反轉它是 RSA 問題,如果我們不知道 $ N $ .

而且,我們可以比較雜湊 $ h_1, h_2 $ 含鹽 $ Salt_1, Salt_2 $ , 我們只檢查是否 $ h_1 ^ {Salt_2} = h_2 ^ {Salt_1} \bmod N $ .

而且,如果您想知道“我們如何獲得價值 $ N $ 我們知道這很難考慮,好吧,我們可以抓住一個適當大小的 RSA 挑戰數。

現在,我並不是真的提倡這種方法(“雜湊”很長);但是它確實表明原則上是可能的。

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