OKB.VN
🔐 ZK & Cryptography

Hash Function là gì?

SHA-256, Keccak-256 — nền tảng tính bất biến của blockchain
⏱ 11 phút đọc📐 ZK & Cryptography🔗 okb.vn

📌 Tóm tắt nhanh

Hash function là hàm một chiều không đảo ngược: nhận input bất kỳ và trả về digest cố định độ dài. Trong blockchain, hash function tạo ra tính bất biến (mỗi block chứa hash của block trước), làm nền tảng PoW mining puzzle, và tổ chức transaction trong Merkle Tree. SHA-256 là của Bitcoin, Keccak-256 là của Ethereum.

1Hash Function là gì?

Hash function (hàm băm) là hàm toán học nhận đầu vào (input) bất kỳ kích thước và trả về một chuỗi cố định độ dài gọi là hash, digest, hoặc fingerprint.

Ví dụ với SHA-256, bất kể input là 1 byte hay 1 GB, output luôn là 256 bit (64 ký tự hex):

SHA256("hello") 2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824
SHA256("Hello") ← chỉ đổi chữ H thành hoa 185f8db32921bd46d35cc2b9d6ce07c7a5be4ec0b26f31e22cd854fafcb0c7a3
SHA256("Bitcoin: A Peer-to-Peer Electronic Cash System...") b1674191a88ec5cdd733e4240a81803105dc412d6c6708d53ab94fc248f4f553

Ba điều bạn thấy ở trên: (1) output luôn dài 64 ký tự hex, (2) thay đổi chữ hoa/thường tạo output hoàn toàn khác, (3) input dài bao nhiêu cũng cho output cùng độ dài.

2Năm thuộc tính bảo mật của Hash Function

Không phải mọi hàm băm đều phù hợp với blockchain. Các cryptographic hash function phải đáp ứng năm thuộc tính bảo mật nghiêm ngặt:

1. Deterministic — Tất định

Cùng input luôn cho cùng output, không bao giờ ngẫu nhiên. Mọi node trên mạng tính SHA256(block_header) phải được cùng kết quả để đồng thuận.

2. Preimage Resistance — Kháng đảo

Biết hash output, không thể tính ngược ra input gốc trong thời gian hợp lý. Đây là tính "một chiều" (one-way). Nếu không có preimage resistance, kẻ tấn công có thể tạo data giả để match bất kỳ hash nào.

3. Second Preimage Resistance

Biết input A, không thể tìm được input B khác (B≠A) sao cho hash(A) = hash(B). Thiếu tính chất này, kẻ tấn công có thể thay thế transaction hợp lệ bằng transaction khác có cùng hash.

4. Collision Resistance — Kháng va chạm

Không thể tìm bất kỳ cặp (A, B) nào với A≠B và hash(A) = hash(B). Yếu hơn second preimage resistance nhưng quan trọng cho Merkle Tree và digital signature schemes.

5. Avalanche Effect — Hiệu ứng tuyết lở

Thay đổi 1 bit trong input → khoảng 50% bit trong output thay đổi. Tạo ra tính "unpredictability" — không thể dự đoán output dù biết input gần đúng.

3Avalanche Effect — Hiệu ứng tuyết lở

Avalanche effect là thuộc tính quan trọng nhất cho PoW mining. Nếu thay đổi nhỏ trong input cho kết quả dự đoán được, miner có thể "hướng dẫn" quá trình mining — phá vỡ tính lottery của PoW.

Thực tế của avalanche effect với SHA-256:

SHA256("nonce=0") 5feceb66ffc86f38d952786c6d696c79c2dbc239dd4e91b46729d73a27fb57e9
SHA256("nonce=1") ← chỉ tăng nonce thêm 1 6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b

Hai hash trên khác nhau hoàn toàn dù input chỉ thay đổi một ký tự. Điều này có nghĩa là miner thực sự phải thử từng giá trị nonce một cách ngẫu nhiên — không có cách "đoán thông minh" để tiết kiệm tính toán. Đây là lý do PoW thực sự tốn năng lượng.

4SHA-256 — Trụ cột của Bitcoin

SHA-256 (Secure Hash Algorithm 256-bit) là hash function được thiết kế bởi NSA và công bố bởi NIST năm 2001. Bitcoin dùng SHA-256 cho tất cả mọi thứ.

SHA-256 trong Bitcoin

  • Block header hash: SHA256(SHA256(block_header)) — chú ý double-SHA256
  • PoW target: Hash phải bắt đầu bằng đủ số bit 0 theo difficulty hiện tại
  • Merkle Tree: Hash của mỗi transaction dùng SHA256
  • Address generation: Bước đầu hash public key bằng SHA256 trước RIPEMD-160
  • TXID: Transaction ID là SHA256(SHA256(raw_tx))

Tại sao Bitcoin dùng Double-SHA256?

Bitcoin dùng SHA256(SHA256(data)) thay vì chỉ một lần. Lý do: phòng ngừa một lớp bảo vệ thêm trước các length extension attack — kiểu tấn công có thể áp dụng với SHA-256 đơn lẻ nhưng bị vô hiệu bởi double-hash.

Thống kê về SHA-256 và Bitcoin

Tổng hash rate của Bitcoin network vào đầu 2024 đạt khoảng 600 EH/s — tức là 600 × 10¹⁸ phép tính SHA-256 mỗi giây. Toàn bộ sức mạnh tính toán này chỉ để tìm nonce thỏa mãn difficulty target — minh chứng rõ nhất cho chi phí của PoW security.

5Keccak-256 — Trụ cột của Ethereum

Ethereum dùng Keccak-256 — không phải SHA-3 chuẩn NIST mà là phiên bản gốc do team Keccak submit vào cuộc thi NIST. Khi NIST chuẩn hóa SHA-3, họ thay đổi một số padding parameter, tạo ra sự khác biệt nhỏ nhưng quan trọng.

Keccak-256 trong Ethereum

  • Address generation: Địa chỉ = 20 bytes cuối của Keccak256(public_key)
  • Transaction hash: TXID = Keccak256(RLP(transaction))
  • State root, receipts root, transactions root trong block header
  • Event topics: Keccak256("Transfer(address,address,uint256)") = event signature
  • Storage slot: Mapping storage key = Keccak256(key + slot)
Lỗi phổ biến: Nhiều developer dùng nhầm thư viện SHA-3 chuẩn để tính Ethereum address và nhận kết quả sai. Phải dùng đúng Keccak-256 (không phải SHA3-256). Solidity có built-in keccak256() chính xác.

6Hash Function trong cấu trúc Block

Hash function là keo dán tạo nên cấu trúc "chain" trong blockchain. Không có hash linking, đây chỉ là một database bình thường.

Chain Linking qua Hash

Mỗi block header chứa trường parentHash = hash của block trước đó. Chuỗi liên kết này tạo ra:

  • Tamper-evidence: Sửa block cũ → hash thay đổi → parentHash trong block tiếp theo không khớp → chain invalid từ điểm đó
  • Ordering: Blocks có thứ tự tuyến tính không thể đảo ngược
  • Commitment: Mỗi block "commit" vào toàn bộ lịch sử trước đó

Cái giá để rewrite lịch sử

Nếu muốn sửa block ở height 100 (trong khi chain hiện tại ở height 800), attacker phải re-mine toàn bộ 700 blocks sau đó với difficulty hiện tại — và làm nhanh hơn toàn bộ honest hashrate để chain mới kịp bắt kịp và vượt chain hiện tại. Đây là lý do 51% attack tốn kém đến vậy. Chi tiết hơn về economic security của blockchain.

7Hash Function trong PoW Mining

Proof of Work dùng hash function như một computational puzzle: tìm nonce sao cho hash của block header thỏa mãn target difficulty.

Mining Puzzle cụ thể

Bitcoin block header bao gồm: version, previousBlockHash, merkleRoot, timestamp, bits (difficulty), nonce. Miner phải tìm nonce sao cho:

SHA256(SHA256(header)) < target

Target là một số 256-bit. Khi difficulty tăng, target giảm → cần nhiều leading zeros hơn → cần thử nhiều nonce hơn → tốn thêm điện. Tháng 1/2024, difficulty của Bitcoin yêu cầu hash bắt đầu bằng khoảng 77 bit 0.

Expected number of hashes

Với target T, xác suất một hash ngẫu nhiên thỏa mãn là T/2²⁵⁶. Expected số lần thử = 2²⁵⁶/T. Khi difficulty = 70 trillion, cần trung bình 70 × 10¹² phép hash để tìm một block hợp lệ.

ASIC và chuyên biệt hóa: Bitcoin ASIC miners được thiết kế chỉ để tính SHA-256 double-hash nhanh nhất có thể. Không làm được gì khác. Điều này là ví dụ cực đoan về specialization vì lợi nhuận kinh tế.

8Collision Attack và giới hạn của Hash Function

Không có hash function nào hoàn toàn miễn nhiễm với collision — đây là điều không tránh được do Pigeonhole Principle: input có thể có vô hạn kích thước, nhưng output chỉ có 2²⁵⁶ giá trị. Vậy luôn tồn tại collision về mặt lý thuyết.

Birthday Attack

Birthday attack là phương pháp tìm collision hiệu quả nhất: thay vì fix một giá trị và tìm collision với nó, tạo ra tập lớn random inputs và tìm hai cái có cùng hash. Xác suất collision đạt 50% chỉ cần khoảng √(2ⁿ) = 2^(n/2) hashes. Với SHA-256: 2^128 hashes — vẫn là con số thiên văn.

Các hash function đã bị break

Hash FunctionTrạng tháiGhi chú
MD5❌ Broken (1996)Collision tìm được trong vài giây
SHA-1❌ Broken (2017)Google SHAttered attack — collision tìm được
SHA-256✅ SecureChưa có tấn công thực tế, dùng trong Bitcoin
Keccak-256✅ SecureChưa có tấn công thực tế, dùng trong Ethereum
SHA-3 (NIST)✅ SecureChuẩn mới nhất, thay SHA-2 dài hạn

Việc SHA-1 bị break là lý do các certificate authority ngừng dùng SHA-1 trong TLS certificates. Blockchain may mắn đã chọn SHA-256 và Keccak-256 từ đầu.

9Hash Function trong ZK Proof và tương lai

Hash function đóng vai trò đặc biệt trong ZK Proof systems — nhưng không phải SHA-256 hay Keccak-256 thông thường mà là các hàm đặc biệt thiết kế cho ZK circuits.

Vấn đề với SHA-256 trong ZK

SHA-256 sử dụng phép XOR, AND, và rotation trên bit — các phép toán này "expensive" (tốn nhiều constraint) khi thể hiện trong ZK circuits (R1CS, PLONK...). Một phép hash SHA-256 có thể cần hàng chục nghìn constraints — quá tốn kém cho ZK proof generation.

ZK-Friendly Hash Functions

  • Poseidon: Thiết kế đặc biệt cho ZK circuits, dùng phép nhân modular thay vì bit operations. Chỉ cần vài trăm constraints thay vì hàng chục nghìn. Dùng trong Zcash, Filecoin, nhiều ZK rollup
  • Pedersen Hash: Dùng elliptic curve addition, very ZK-friendly
  • MiMC, GMiMC: Các hàm khác thiết kế tối ưu cho ZK contexts

Đây là lý do ZK-STARK dùng hash function (Rescue, BLAKE) thay vì elliptic curve pairing — trade-off giữa proof size và prover cost tùy use case.

10Câu hỏi thường gặp (FAQ)

Hash function là hàm toán học một chiều nhận input bất kỳ độ dài và trả về output cố định độ dài (digest). Không thể tính ngược từ digest ra input gốc. Cùng input luôn cho cùng output, nhưng thay đổi nhỏ (1 bit) trong input tạo ra output hoàn toàn khác (avalanche effect).

SHA-256 do NSA thiết kế và NIST chuẩn hóa năm 2001, dùng trong Bitcoin. Keccak-256 do team độc lập (Belgium) thiết kế, dùng trong Ethereum — là phiên bản gốc trước khi NIST chuẩn hóa thành SHA-3 với một số thay đổi nhỏ. Cả hai đều an toàn, khác nhau về internal structure (Merkle-Damgård vs sponge construction).

Nếu kẻ tấn công tìm được hai transaction khác nhau có cùng hash, họ có thể thay thế transaction hợp lệ bằng transaction gian lận trong Merkle Tree mà block header không phát hiện. Collision resistance đảm bảo mỗi transaction có fingerprint duy nhất không thể giả mạo.

Grover's algorithm trên máy tính lượng tử có thể tìm preimage của SHA-256 trong khoảng 2^128 operations thay vì 2^256 — giảm một nửa security bits. SHA-256 vẫn an toàn nếu tăng lên SHA-512 (hoặc dùng SHA-256 với các biện pháp bổ sung). So với ECC bị Shor algorithm đe dọa nghiêm trọng hơn, hash function ít bị ảnh hưởng bởi quantum computing hơn nhiều.

Double-SHA256 (SHA256 hai lần liên tiếp) giúp phòng ngừa length extension attack — một điểm yếu của SHA-256 đơn lẻ khi dùng trong MAC (Message Authentication Code) schemes. Dù Bitcoin không dùng SHA-256 như MAC theo nghĩa truyền thống, Satoshi áp dụng double-hash như lớp bảo vệ thêm theo best practice thời điểm đó.

📚Tham khảo

  1. NIST FIPS 180-4 — Secure Hash Standard (2015)
  2. Bertoni et al. — "Keccak" (original submission to NIST SHA-3 competition)
  3. Stevens et al. — "The First Collision for Full SHA-1" (SHAttered, 2017)
  4. Grassi et al. — "Poseidon: A New Hash Function for Zero-Knowledge Proof Systems" (2019)
  5. Nakamoto, S. — Bitcoin Whitepaper (2008)
📚 Khám phá thêm theo chủ đề
113 bài phân tích kỹ thuật — Blockchain Infrastructure từ nền tảng đến nâng cao
🔷Fundamentals — Nền tảng10 bài
📋 Xem tất cả bài viết →