
Thuật toán Keccak là một họ hàm băm mật mã được xây dựng nhằm ánh xạ dữ liệu đầu vào bất kỳ thành một dấu vân tay số có độ dài cố định. Đây là nền tảng của chuẩn SHA-3 và được sử dụng rộng rãi trong các ứng dụng blockchain.
Một hàm băm có thể coi như một “máy tạo dấu vân tay số”: cùng một đầu vào sẽ luôn cho ra cùng một kết quả, nhưng gần như không thể phục hồi dữ liệu gốc chỉ từ đầu ra. Keccak hỗ trợ nhiều độ dài đầu ra khác nhau, phổ biến nhất là 256 bit (Keccak-256). Đầu ra cố định này giúp xác thực, lập chỉ mục và kiểm tra tính nhất quán hiệu quả.
Keccak giữ vai trò cốt lõi vì là “máy tạo dấu vân tay số” trung tâm cho các hệ thống như Ethereum, làm nền tảng cho các quy trình thiết yếu như tạo địa chỉ, bộ chọn hàm hợp đồng thông minh và lập chỉ mục nhật ký sự kiện.
Chẳng hạn, trên các sàn như Gate, khi bạn nạp ETH, địa chỉ bắt đầu bằng “0x” được tạo ra bằng cách băm khóa công khai với Keccak-256 và lấy 20 byte cuối. Đối với lệnh gọi hợp đồng, bộ chọn hàm được tạo bằng cách băm chữ ký hàm với Keccak-256 và lấy 4 byte đầu tiên. Nhật ký sự kiện dùng Keccak để sinh chủ đề, giúp tìm kiếm nhanh chóng.
Keccak sử dụng cấu trúc “bọt biển” (sponge construction). Hình dung như một miếng bọt biển: trước tiên “hút” dữ liệu đầu vào để trộn trạng thái bên trong, sau đó “vắt” ra giá trị băm mong muốn.
Bước 1, Hấp thụ: Thông điệp đầu vào được chia thành các khối, sau đó XOR vào “vùng ghi” của trạng thái—giống như bọt biển hút nước và tích hợp dữ liệu vào trạng thái.
Bước 2, Hoán vị: Hàm hoán vị (Keccak-f) được áp dụng nhiều vòng để xáo trộn các bit trong trạng thái. Quá trình này là “xáo trộn” có thể đảo ngược; Keccak-f[1600] thường chạy 24 vòng.
Bước 3, Vắt: Đầu ra được đọc từ “vùng đọc” của trạng thái. Nếu cần đầu ra dài hơn, tiếp tục hoán vị rồi trích xuất thêm dữ liệu—như vắt thêm nước từ bọt biển khi cần.
Với tham số chuẩn Keccak-256, trạng thái bên trong có 1.600 bit, chia thành bitrate (vùng đọc/ghi) 1.088 bit và capacity (bộ đệm bảo mật) 512 bit. Capacity càng lớn, bảo mật càng cao.
Keccak có bốn ứng dụng chính trong Ethereum: tạo địa chỉ, bộ chọn hàm, chủ đề sự kiện và lập chỉ mục cấu trúc dữ liệu.
Điểm khác biệt chính giữa Keccak và SHA3 nằm ở tham số padding (“phân tách miền”). SHA3-256 dùng hậu tố padding 0x06, còn Keccak-256 phổ biến trên Ethereum dùng 0x01.
Do đó, cùng một đầu vào sẽ cho kết quả khác nhau giữa Keccak-256 và SHA3-256. Khi phát triển hoặc kiểm toán, cần xác định rõ đang dùng “Keccak-256” hay “SHA3-256”—không thể thay thế cho nhau. Khi NIST chuẩn hóa SHA-3 năm 2015, họ đã điều chỉnh tham số phân tách miền này (nguồn: NIST, 2015).
Bước một: Xác định đầu vào là byte hay văn bản. Nếu là chuỗi, luôn mã hóa UTF-8; nếu là chuỗi hex, chuyển thành byte thô và không tính tiền tố “0x” là dữ liệu.
Bước hai: Chọn đúng hàm. Trong EVM, keccak256 (tức Keccak-256) là chuẩn. Một số thư viện gọi SHA3-256 là sha3—cần kiểm tra tài liệu và phiên bản kỹ để tránh nhầm lẫn.
Bước ba: Đối chiếu kết quả. Dùng hai thư viện hoặc công cụ độc lập để tính băm và đảm bảo kết quả khớp; có thể lấy các selector đã biết như "transfer(address,uint256)" ra "0xa9059cbb" làm ví dụ thử nghiệm.
Hãy coi giá trị băm là dấu vân tay số không thể đảo ngược—không phải mã hóa hay số ngẫu nhiên. Để tránh tấn công rainbow table, luôn thêm salt ngẫu nhiên trước khi băm và băm cả salt lẫn dữ liệu cùng lúc.
Có ba sai sót chính: khác biệt padding, lỗi mã hóa và sử dụng sai trong ứng dụng.
Bảo mật của Keccak dựa vào cấu trúc bọt biển và tham số capacity. Với Keccak-256, chống va chạm khoảng 2^128 phép tính; chống tìm ảnh gốc khoảng 2^256 phép tính.
Đến tháng 01 năm 2025, chưa có tấn công thực tế nào thành công với thông số chuẩn; nghiên cứu chủ yếu tập trung vào biến thể giảm vòng hoặc giới hạn lý thuyết. Về hiệu năng, các thư viện hàng đầu đã tối ưu hóa cho CPU/GPU với thông lượng cao; tăng tốc phần cứng (ASIC) đang phát triển cho các trường hợp đặc biệt.
Keccak sẽ tiếp tục là trung tâm bảo mật hệ thống với vai trò lõi của SHA-3; trong hệ sinh thái EVM, Keccak là nền tảng cho địa chỉ, selector và lập chỉ mục log. Khi tăng tốc phần cứng phát triển và các thư viện hoàn thiện, cả hiệu năng và công cụ sẽ tiến xa hơn. Một số trường hợp mới (như zero-knowledge proofs) có thể dùng hàm băm thay thế như Poseidon, nhưng điều này không ảnh hưởng đến sự ổn định của Keccak cho các tác vụ băm và lập chỉ mục phổ thông. Nhà phát triển chỉ cần phân biệt rõ Keccak-256 với SHA3-256, quản lý chặt mã hóa và kiểm thử, Keccak vẫn là công cụ nền tảng đáng tin cậy.
Trong Ethereum, Keccak-256 dùng để tạo địa chỉ tài khoản—bằng cách băm khóa công khai với Keccak-256 và lấy 20 byte cuối làm địa chỉ. Nếu bạn dùng Gate hoặc ứng dụng ví khác, quá trình này diễn ra tự động; nếu phát triển hợp đồng thông minh, có thể dùng hàm keccak256() tích hợp sẵn trong Solidity. Hãy thử các thư viện như Web3.js để quan sát cách hàm băm chuyển dữ liệu dài bất kỳ thành kết quả cố định 256 bit.
Lý do thường là khác biệt trong mã hóa dữ liệu đầu vào. Keccak-256 yêu cầu dữ liệu dạng byte—nếu nhập chuỗi văn bản, các công cụ có thể xử lý mã hóa ký tự khác nhau (UTF-8 so với ASCII). Cách khắc phục là chuẩn hóa mã hóa và chỉ rõ định dạng đầu vào khi phát triển; các nền tảng như Gate thường có hướng dẫn nhập liệu rõ ràng. Ngoài ra, cần xác nhận đang dùng Keccak-256 hay SHA3-256—kết quả sẽ khác dù đầu vào giống nhau.
Keccak-256 có nhiều ứng dụng trong hợp đồng thông minh: xác thực toàn vẹn dữ liệu (băm dữ liệu giao dịch để so sánh), tạo mã định danh duy nhất (băm các tham số kết hợp), hoặc kiểm soát truy cập (lưu thông tin nhạy cảm dưới dạng băm thay vì văn bản gốc). Một số hợp đồng băm dữ liệu người dùng trước khi lưu để tránh lộ thông tin thực. Tính linh hoạt này giúp Keccak trở thành công cụ nền tảng của Web3—nhưng lưu ý băm là một chiều: không thể phục hồi dữ liệu gốc từ giá trị băm.
Không. Với người dùng Web3 hoặc lập trình viên mới, chỉ cần hiểu “Keccak là hàm băm một chiều—đầu vào giống nhau luôn cho kết quả giống nhau.” Nghiên cứu sâu về mật mã là tùy chọn (cho kiểm toán bảo mật hoặc nghiên cứu); đa số lập trình viên chỉ cần gọi hàm thư viện sẵn có như keccak256 của Solidity. Hãy bắt đầu bằng cách thử nghiệm với các ứng dụng thực tế như chữ ký hoặc tạo địa chỉ trên Gate hoặc testnet.
Khi gọi Keccak từ mã ngoài chuỗi (front end hoặc back end), cần đảm bảo phiên bản thư viện đồng nhất với trên chuỗi—thường là Keccak-256. Dùng các thư viện tiêu chuẩn như Web3.js hoặc ethers.js sẽ hạn chế tối đa sai sót vì mặc định đã triển khai đúng Keccak. Lưu ý việc tuần tự hóa dữ liệu—nếu sinh giá trị băm ngoài chuỗi để xác thực trên chuỗi, phương pháp tuần tự hóa (như mã hóa ABI) phải khớp tuyệt đối. Luôn kiểm thử kỹ trong môi trường thử nghiệm, nhất là các trường hợp chữ ký hoặc xác thực hợp đồng.


