Hash
為什麼比特幣協議中的雜湊通常計算兩次(雙重計算)?
根據比特幣協議的 wiki 規範,雜湊通常“計算兩次”。例如:
hello 2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824 (first round of sha-256) 9595c9df90075148eb06860365df33584b75bff782a510c6cd4883a419833d50 (second round of sha-256)
這是什麼原因?我想它以某種方式提供了額外的安全性,或針對潛在攻擊媒介的保護,但我無法推斷這些攻擊可能是什麼。
我們不確定,但最流行的理論是選擇雙雜湊來防止長度擴展攻擊。
維基聲稱這是為了防止生日攻擊是錯誤的。如果您可以在一次呼叫雜湊函式時成功執行生日攻擊,那麼您將在第二次呼叫時成功執行生日攻擊。這很容易看出有
hash(x) == hash(y)
暗示hash(hash(x)) == hash(hash(y))
。如果你真的想防範這種情況,你會做類似的事情
hash(x||hash(x))
。在這種情況下,在單個呼叫中發現衝突hash
不會直接在雙重呼叫中產生衝突。