Hash

將散列集合組合成單個散列的有效方法?

  • July 25, 2017

我有一個系統,每個使用者都會送出一組數據。數據將被散列並且它們的散列將被送出給伺服器。我的計劃是結合每個使用者雜湊(轉換為字節 XOR’d 與根雜湊)以生成最終雜湊。這樣做是為了創建熵,以便最終散列可用於生成“隨機”數。不可能在系統上生成偽/真正的隨機數,因此可以解決。

目前,我在伺服器上執行以下操作(虛擬碼):

//hexidecimal 54673257461630679457 (large prime)

var rootHash = 0x2F6BE6DFD71F8B9A1;

submitData(var userHash){
   rootHash ^= userHash;
}

在所有使用者散列與根散列進行異或運算後,根散列被轉換為一個數字,然後該數字的最後 10 位用作“隨機數”。

使用者可以看到彼此的雜湊值,但是使用這樣的系統,我認為即使他們計算了最終數字,送出新數據也會更改根雜湊,從而更改生成的最終數字。

我在這個領域不是很有經驗,所以我的問題是,使用這樣的方法有什麼缺點,有沒有更有效的方法來做到這一點?

使用所描述的系統,最後一個送出其雜湊的參與者可以rootHash通過選擇他/她送出的雜湊值輕鬆地選擇“隨機數”,知道之前參與者送出的雜湊的初始值和什麼(他/她計算這些和的異或 $ d+10^{10}r $ 截斷為雜湊寬度,其中 $ d $ 是所需的 10 位數值,並且 $ r $ 是隨機的;這確保“隨機數”是 $ d $ ).

即使她/他送出的內容必須是某物的雜湊值(這是不為人知的),找到合適的東西也是可行的(預計僅需要 5 億個雜湊值;如果最後兩個送出者勾結,則需要數十萬個雜湊值)。

用送出的串聯雜湊替換 XOR 並沒有多大幫助(例如,最後一個送出者很容易強制“隨機數”為偶數)。

真正解決這個問題的方法可能是:

  1. 每個參與者隨機抽取一個 $ x_i $ (比如說,128 位)
  2. 每個參與者送出的雜湊 $ h_i=H(x_i) $ 發給伺服器和/或每個參與者;這就是所謂的承諾 $ x_i $
  3. 完成上述內容後,每個參與者都會展示其 $ x_i $
  4. 伺服器和/或每個參與者檢查 $ H(x_i)=h_i $ 所有參與者
  5. 這 $ x_i $ 就像問題中的雜湊一樣被處理(沒有理由初始化rootHash為一個隨意的值,零也可以)。

這樣,每個送出者都可以確信,無論其他參與者之間可能存在什麼勾結,“隨機數”至少與 $ x_i $ 她/他送出,如果雜湊是抗衝突的(暗示它很寬,例如 256 位)。注意:如果雜湊不是抗碰撞的,則最後一個送出者 $ x_i $ 本來可以選擇 $ x_i $ 和 $ x_i’ $ 具有相等的雜湊 $ h_i $ ,然後知道 $ x_i $ 的所有其他參與者可以決定送出 $ x_i $ 或者 $ x_i’ $ 從而以某種可控的方式影響“隨機數”。

根據您的具體要求(您是否經常更新或刪除數據?)Merkle-Tree可能會在這方面為您提供幫助。

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