Solidity
keccak256(a, b) 函式是如何實現的?
我需要了解 keccak256(a, b) 是如何實現的,以及它與 keccak256(a || b) 有何不同。
內容是否填充?
我需要這個,因為我不想允許使用者可以偽造雜湊的漏洞,例如通過執行以下操作: H(0xabc, 0xdef) = H(0xa, 0xbcdef) 這將是一個主要的安全漏洞。
謝謝
Solidity 使用非標準打包模式,其中參數被緊密打包。您可以查看文件中的算法:Solidity: non-standard-packed-mode
綜上,
keccak256(a,b) = keccak(a || b)
給出。你可能想知道為什麼你的例子keccak256(0xa, 0xa) ≠ keccak256(0xaa)
似乎證明了我的論點是錯誤的。這僅僅是因為您嘗試使用 Solidity 中未知的數據類型。在 Solidity 中,數字以 8 位的倍數儲存。您嘗試使用僅包含 4 位的數字,導致 Solidity 編譯器被迫填充您的數字以適合 8 位。0xa
比如變成0x0a
了。所以你試圖keccak256(0xa, 0xa) = keccak256(0x0a, 0x0a) = keccak256(0x0a0a)
比較keccak256(0xaa)