
Keccak 演算法是一類密碼學雜湊函數家族,可將任意輸入資料轉換為固定長度的數位指紋。它是 SHA-3 標準的基礎,並被廣泛應用於區塊鏈領域。
雜湊函數可視為「指紋產生器」:相同的輸入一定會產生相同的輸出,但僅根據輸出幾乎無法還原原始輸入。Keccak 支援可變長度輸出,其中以 256 位元(Keccak-256)最常見。固定長度的輸出方便高效驗證、建立索引與進行一致性檢查。
Keccak 作為以太坊等系統的核心「指紋產生器」,支撐地址產生、智能合約函數選擇器與事件日誌索引等關鍵流程。
舉例來說,在 Gate 等交易所儲值 ETH 時,「0x」開頭的地址是對公鑰執行 Keccak-256 雜湊並取最後 20 個位元組產生。合約呼叫時,函數選擇器則是將函數簽名以 Keccak-256 雜湊後擷取前 4 個位元組取得。事件日誌則利用 Keccak 產生主題,實現快速檢索。
Keccak 採用「海綿結構」設計。可以將其比擬成一塊海綿:先「吸收」輸入資料混合內部狀態,再「擠壓」出所需的雜湊輸出。
第一步,吸收:輸入訊息會被分塊,並以異或方式寫入狀態的「可寫區域」,如同海綿吸水,將資料整合至內部狀態。
第二步,置換:多輪應用置換函數(Keccak-f)打亂狀態中的位元。置換過程是一種可逆的「洗牌」,Keccak-f[1600] 通常執行 24 輪。
第三步,擠壓:從狀態的「可讀區域」擷取輸出。若需更長的輸出,則持續置換後再提取資料,就像按需求反覆擠壓海綿。
在標準 Keccak-256 參數下,內部狀態為 1600 位元,分為 1088 位元比特率(讀寫區)與 512 位元容量(安全緩衝區)。容量越大,安全性越高。
Keccak 在以太坊主要有四大用途:地址產生、函數選擇器、事件主題以及資料結構索引。
Keccak 與 SHA3 的最大差異在於填充(「域分隔」)參數。SHA3-256 的填充後綴為 0x06,而以太坊常用的 Keccak-256 則為 0x01。
因此,相同輸入在 Keccak-256 和 SHA3-256 下會產生不同的輸出。開發或稽核時,務必確認使用的是「Keccak-256」還是「SHA3-256」——兩者不可混用。NIST 在 2015 年標準化 SHA-3 時進行了這項域分隔調整(來源:NIST,2015)。
第一步:確認輸入型態是位元組還是文字。若為字串,務必使用 UTF-8 編碼;若為十六進位字串,需轉為原始位元組,且「0x」前綴不參與雜湊。
第二步:選擇正確的函數。在 EVM 中,keccak256(即 Keccak-256)為標準。有些函式庫將 SHA3-256 稱為 sha3——請務必詳閱文件與庫版本,避免混淆。
第三步:交叉驗證結果。建議用兩套獨立函式庫或工具計算雜湊並比對結果,也可用 "transfer(address,uint256)" 得到 "0xa9059cbb" 等已知選擇器來測試。
雜湊應視為不可逆的指紋——它不是加密,也不是隨機數。為防止彩虹表攻擊,務必在雜湊前加入隨機鹽,並將鹽與資料一同雜湊。
主要有三大陷阱:填充差異、編碼錯誤,以及應用場景誤用。
Keccak 的安全性取決於其海綿結構與容量參數。Keccak-256 的抗碰撞強度約為 2^128 次運算,抗原像強度約為 2^256 次運算。
截至 2025 年 1 月,標準參數下尚未發現實際可行的碰撞或原像攻擊,相關研究主要聚焦於降輪變體或理論極限。效能方面,主流函式庫已針對 CPU/GPU 進行高效能優化,硬體加速(如 ASIC)也在高需求場景持續發展。
Keccak 作為 SHA-3 的核心演算法,將持續保障系統安全;在 EVM 生態系中,Keccak 是地址、選擇器與日誌索引的基礎。隨著硬體加速與函式庫實作更加成熟,效能與工具鏈還會持續提升。部分新應用(如零知識證明)可能會採用 Poseidon 等雜湊演算法,但這不影響 Keccak 在通用指紋與索引場景的穩定地位。開發者只需明確區分 Keccak-256 與 SHA3-256,嚴格管理編碼與測試流程,Keccak 仍是可靠的底層工具。
在以太坊中,Keccak-256 用於產生帳戶地址——對公鑰執行 Keccak-256 雜湊並取最後 20 個位元組作為地址。使用 Gate 或其他錢包應用時,這個流程會自動完成;開發智能合約時,可直接使用 Solidity 的 keccak256() 內建函數。建議先以 Web3.js 等函式庫體驗雜湊如何將任意長度資料轉為固定 256 位元結果。
這通常是因為輸入資料的編碼方式不同。Keccak-256 預期輸入為位元組資料——輸入字串時,各工具可能採用不同字元編碼(如 UTF-8 或 ASCII)。解決方式是在開發時統一編碼並明確指定輸入格式;Gate 等平台通常會提供清楚的輸入說明。同時要確認使用的是 Keccak-256 還是 SHA3-256——即使輸入相同,輸出也會不同。
Keccak-256 在智能合約中的應用非常廣泛:可用於驗證資料完整性(對交易資料雜湊比對)、產生唯一 ID(對參數組合雜湊)、或實現存取控制(將敏感資訊以雜湊形式儲存而非明文)。部分合約會先雜湊用戶資料再儲存,避免洩漏原始值。這種彈性讓 Keccak 成為 Web3 的基礎工具——但請注意雜湊是單向的,無法從雜湊值還原原始資料。
不需要。作為 Web3 使用者或初階開發者,只需理解「Keccak 是單向雜湊函數——相同輸入必然產生相同結果」。進階密碼學學習屬於選修(如安全稽核或研究),多數開發者只需呼叫現有函式庫,例如Solidity 的 keccak256。建議先於 Gate 或測試網實際體驗簽章、地址產生等應用。
在鏈下程式(前端或後端)呼叫 Keccak 時,請確保函式庫版本與鏈上保持一致——通常為 Keccak-256。使用 Web3.js、ethers.js 等標準庫可避免大多數問題,這些函式庫預設正確實作 Keccak。請特別留意資料序列化——若鏈下產生雜湊供鏈上驗證,序列化方式(如 ABI 編碼)必須完全一致。涉及簽章或合約驗證等場景時,務必於測試環境充分驗證。


