Cách hoạt động của SHA-256
SHA-256 là gì?
Không cần biết toán. Không cần biết lập trình. Chỉ cần biết uống cà phê và tò mò một chút.
Mở đầu — Tại sao Bạn cần biết cái này?
Bạn có bao giờ tự hỏi:
- Tại sao khi quên mật khẩu Facebook, họ không gửi lại mật khẩu cũ mà bắt mình đặt cái mới?
- Tại sao tải một file từ internet, người ta hay kèm theo một dãy ký tự lạ hoắc như
a591a6d40bf420...? - Bitcoin lưu lịch sử giao dịch thế nào mà không ai sửa được?
Câu trả lời cho cả ba câu hỏi trên đều liên quan đến một thứ tên là SHA-256.
Mình sẽ giải thích nó từ đầu đến cuối, không bỏ qua thứ gì, bằng ngôn ngữ bình thường nhất có thể.
Phần 1 — SHA-256 là cái máy xay kỳ lạ
Hãy tưởng tượng Bạn có một cái máy xay sinh tố đặc biệt. Điểm đặc biệt ở chỗ:
- Bạn bỏ vào 1 quả dâu → nó xay ra một ly đúng 200ml
- Bạn bỏ vào 1 tấn dâu → nó vẫn xay ra một ly đúng 200ml
- Bạn bỏ vào toàn bộ nội dung Wikipedia → một ly, đúng 200ml, không hơn không kém
Đó chính xác là cách SHA-256 hoạt động. Bạn nhét vào bất kỳ thứ gì — một chữ, một file nhạc, một bộ phim 4K — nó luôn nhả ra đúng 64 ký tự. Không bao giờ 63, không bao giờ 65.
Dãy 64 ký tự đó gọi là hash (hay còn gọi là digest, checksum, fingerprint — tùy ngữ cảnh, nhưng bản chất như nhau).
Ví dụ thật:
SHA-256("xin chào") = 4cf6f... (64 ký tự)
SHA-256("Xin chào") = 9a3bc... (64 ký tự, khác hoàn toàn!)
SHA-256("toàn bộ bộ luật dân sự Việt Nam 700 trang") = f72d1... (vẫn 64 ký tự)
Cái này thuật ngữ gọi là hàm băm mật mã học (cryptographic hash function). SHA là viết tắt của Secure Hash Algorithm, còn 256 là số bits trong output — tức 256 bit = 32 byte = 64 ký tự hex.
Phần 2 — Bốn tính chất khiến SHA-256 thần thánh
Cái máy xay sinh tố bình thường của Bạn không có những tính chất này. SHA-256 thì có.
Tính chất 1: Deterministic — Bỏ vào gì ra nấy, không bao giờ sai
Gõ "xin chào" hôm nay, hay 10 năm sau, hay trên máy tính nào đi nữa — hash ra luôn y chang nhau. Không phải "gần giống", mà hoàn toàn giống từng ký tự một.
Điều này nghe hiển nhiên nhưng thực ra rất quan trọng. Nó cho phép Bạn so sánh hash mà không cần giữ nguyên dữ liệu gốc.
Tính chất 2: One-way — Máy xay một chiều, không có nút "xay ngược"
Biết hash nhưng không thể tìm ra input gốc. Đây là tính chất quan trọng nhất.
Hãy nghĩ đến trứng chiên: biết trứng chiên trông như thế nào, nhưng không thể "un-fry" nó về lại quả trứng sống. SHA-256 cũng vậy — nó là quá trình một chiều không thể đảo ngược về mặt toán học.
Nói kỹ hơn: để tìm input từ output bằng cách thử sai, Bạn cần thử khoảng 2²⁵⁶ lần — con số lớn hơn tổng số nguyên tử trong vũ trụ quan sát được. Kể cả toàn bộ máy tính trên thế giới chạy đến tận khi mặt trời tắt cũng không làm được.
Tính chất 3: Avalanche Effect — Thay 1 ký tự, hash đổi hoàn toàn
SHA-256("xin chào") = 4cf6f28a...
SHA-256("Xin chào") = 9a3bc71e... ← khác chữ hoa/thường thôi!
Hai chuỗi chỉ khác nhau 1 bit (chữ x vs X), nhưng hash ra hai kết quả không có điểm tương đồng nào. Trung bình khoảng 50% số bit trong output thay đổi khi bạn sửa 1 bit trong input.
Tại sao cần điều này? Vì nếu thay đổi nhỏ → hash thay đổi nhỏ, thì hacker có thể đoán dần dần để tìm ra input. Avalanche effect triệt tiêu khả năng đó.
Tính chất 4: Collision Resistant — Gần như không thể có hai thứ khác nhau mà hash giống nhau
Nếu A ≠ B thì SHA-256(A) ≠ SHA-256(B) — với xác suất gần như tuyệt đối.
Về lý thuyết, collision (hai input khác nhau cho ra cùng hash) vẫn có thể tồn tại — vũ trụ có vô hạn input nhưng SHA-256 chỉ có 2²⁵⁶ output có thể. Nhưng để tìm được một cặp collision bằng cách brute-force, cần đến khoảng 2¹²⁸ lần thử. Hiện tại không có máy tính nào làm được điều đó.
Phần 3 — Bên trong SHA-256 thực sự làm gì?
Mình sẽ giải thích theo kiểu "bếp núc bên trong" — không dùng công thức toán, chỉ dùng hình ảnh.
Bước 1: Chuẩn bị nguyên liệu (Padding)
SHA-256 xử lý dữ liệu theo từng khối 512 bit (64 byte). Nhưng input của Bạn có thể không vừa tròn 512 bit — ví dụ chữ "abc" chỉ có 24 bit.
Nên trước tiên phải "độn" thêm:
- Thêm bit 1 ngay sau nội dung gốc (làm dấu phân cách)
- Thêm nhiều bit 0 cho đến khi gần đầy block
- Thêm 64 bit cuối chứa độ dài thật sự của message gốc
Kết quả: dữ liệu sau padding luôn là bội số của 512 bit.
Tại sao cần bước này? Vì nếu không có bit 1 làm dấu phân cách, Bạn không phân biệt được "A" + 7 bytes zero với "A\0\0\0\0\0\0\0" — chúng trông giống nhau sau khi pad bằng zero. Bit 1 đó giải quyết sự mơ hồ đó.
Bước 2: Tạo 64 "từ" để dùng trong 64 vòng (Message Schedule)
Mỗi block 512 bit được chia thành 16 từ 32-bit (W[0] đến W[15]).
Nhưng SHA-256 cần đủ 64 từ cho 64 vòng xử lý. Nên nó tính thêm W[16] đến W[63] bằng cách trộn các từ trước đó lại với nhau:
W[t] = một hàm của W[t-2], W[t-7], W[t-15], W[t-16]
Hàm đó dùng xoay bit (rotate) và dịch bit (shift) — về cơ bản là đảo lộn từng bit theo nhiều cách khác nhau để tạo ra giá trị mới khó đoán.
Mình hay hình dung bước này như đang trộn bột: Bạn có 16 nguyên liệu ban đầu, nhưng cần trộn đi trộn lại 64 lần với nhiều tỷ lệ khác nhau để bột đồng đều khắp nơi.
Bước 3: 64 vòng nén — Trái tim của thuật toán
Đây là phần chính. SHA-256 duy trì 8 thanh ghi 32-bit — hãy gọi chúng là 8 cái "xô" chứa nước, tạm thời ký hiệu là a, b, c, d, e, f, g, h.
Ban đầu 8 cái xô này được đổ đầy bằng các giá trị hằng số — những giá trị này được tính từ phần thập phân của căn bậc hai của 8 số nguyên tố đầu tiên (2, 3, 5, 7, 11, 13, 17, 19). Mình giải thích tại sao dùng số nguyên tố ở phần sau.
Trong mỗi vòng trong số 64 vòng, thuật toán làm những việc sau:
Tính T1 (giá trị tạm thời 1):
- Lấy nội dung xô
h - Cộng thêm kết quả của hàm
Σ₁(e)— xoay xôetheo 3 cách rồi XOR lại - Cộng thêm hàm
Ch(e, f, g)— "Choice": với mỗi bit, nếu bit đó trongelà 1 thì lấy bit từf, ngược lại lấy từg - Cộng thêm hằng số K[t] của vòng này
- Cộng thêm từ W[t] vừa chuẩn bị ở bước 2
Tính T2 (giá trị tạm thời 2):
- Lấy hàm
Σ₀(a)— xoay xôatheo 3 cách khác rồi XOR lại - Cộng thêm hàm
Maj(a, b, c)— "Majority": với mỗi bit, lấy giá trị xuất hiện nhiều hơn trong ba xô
Cập nhật 8 xô:
h ← g
g ← f
f ← e
e ← d + T1
d ← c
c ← b
b ← a
a ← T1 + T2
Tức là mọi thứ dịch chuyển sang phải một bước, còn a và e nhận giá trị mới.
Sau 64 vòng như vậy, 8 cái xô đã bị khuấy trộn cực kỳ phức tạp.
Bước 4: Cộng ngược lại và ra kết quả
Sau 64 vòng, lấy 8 giá trị cuối cùng trong 8 xô, cộng với 8 giá trị ban đầu (trước khi bắt đầu 64 vòng) — cộng theo kiểu modulo 2³², tức là nếu kết quả vượt quá 32 bit thì bỏ phần tràn.
Nếu message có nhiều block (dài hơn 512 bit), lấy kết quả block trước làm "giá trị khởi tạo" cho block sau, rồi tiếp tục.
Sau khi xử lý hết tất cả block, ghép 8 giá trị cuối lại → đó là hash SHA-256 của Bạn, 256 bit = 64 ký tự hex.
Phần 4 — Tại sao dùng số nguyên tố để tạo hằng số?
SHA-256 dùng hai bộ hằng số:
H₀ đến H₇ (8 giá trị khởi tạo):
- Lấy 8 số nguyên tố đầu tiên: 2, 3, 5, 7, 11, 13, 17, 19
- Tính căn bậc hai của mỗi số, lấy phần thập phân, nhân với 2³²
- Ví dụ: √2 = 1.41421356... → lấy 0.41421356... × 2³² = 0x6a09e667
K[0] đến K[63] (64 hằng số cho 64 vòng):
- Lấy 64 số nguyên tố đầu tiên
- Tính căn bậc ba của mỗi số, lấy phần thập phân, nhân với 2³²
Tại sao phải làm vậy thay vì dùng số ngẫu nhiên? Vì dùng số nguyên tố theo công thức công khai như này, bất kỳ ai cũng tự tính được và xác nhận là các hằng số đó không chứa backdoor. Nếu NSA tự bịa ra mấy con số đó thì ai biết họ có nhét cửa hậu vào không?
Đây gọi là nguyên tắc "Nothing Up My Sleeve Numbers" — không có gì giấu trong tay áo.
Phần 5 — Ứng dụng thực tế số 1: Mật khẩu của Bạn được lưu như thế nào
Đây là ứng dụng Bạn chạm vào hàng ngày mà không biết.
Kịch bản: Bạn đăng ký tài khoản
Bạn gõ: "matkhau123"
Server làm: hash = SHA-256("matkhau123") → "ef92b778..."
Server lưu vào database: ef92b778...
Mật khẩu gốc matkhau123 không bao giờ được lưu. Server quên nó ngay lập tức sau khi hash xong.
Kịch bản: Bạn đăng nhập
Bạn gõ lại: "matkhau123"
Server làm: hash = SHA-256("matkhau123") → "ef92b778..."
Server so sánh: "ef92b778..." có bằng "ef92b778..." trong database không?
Có → Cho vào!
Server không cần biết mật khẩu gốc để xác thực — chỉ cần so hash.
Kịch bản: Database bị hack
Giả sử hacker lấy được toàn bộ database của Facebook. Trong đó chỉ có:
user: fairy@email.com
password_hash: ef92b778...
Hacker nhìn vào ef92b778... — họ biết đó là hash SHA-256, nhưng không thể đảo ngược để ra matkhau123. Đây chính là lý do lưu hash thay vì lưu plaintext.
Đây cũng là lý do khi Bạn quên mật khẩu, Facebook không thể "gửi lại mật khẩu cũ" — vì họ thật sự không có nó. Họ chỉ có thể cho Bạn đặt mật khẩu mới.
Vậy tại sao vẫn cần mật khẩu mạnh?
Hacker có thể dùng rainbow table — một bảng khổng lồ đã hash sẵn hàng triệu mật khẩu phổ biến:
"123456" → hash: 8d969e...
"password" → hash: 5e8848...
"matkhau123" → hash: ef92b778...
Nếu Bạn dùng mật khẩu yếu, hacker tra bảng ra ngay. Đó là lý do mật khẩu mạnh vẫn quan trọng dù đã được hash.
Ứng dụng tốt còn thêm salt — một chuỗi ngẫu nhiên ghép vào trước khi hash:
hash = SHA-256(salt + "matkhau123")
Mỗi user có salt khác nhau, nên dù hai người cùng dùng mật khẩu 123456, hash trong database vẫn khác nhau — vô hiệu hóa rainbow table.
Quan trọng: SHA-256 thuần không nên dùng để lưu mật khẩu. Dùng bcrypt hoặc Argon2 — chúng được thiết kế cố ý chậm để brute-force mất nhiều năm hơn. SHA-256 quá nhanh, có thể thử hàng tỷ mật khẩu mỗi giây bằng GPU.
Phần 6 — Ứng dụng thực tế số 2: Xác thực file tải về
Mình hay gặp tình huống này: tải một file lớn từ một trang mirror không quen, lo ngại file bị nhét thêm malware.
Cách kiểm tra: so hash.
Trang chủ Ubuntu ghi rõ:
ubuntu-24.04-desktop-amd64.iso
SHA-256: a35d7...8f4b (64 ký tự)
Bạn tải file về, chạy lệnh:
sha256sum ubuntu-24.04-desktop-amd64.iso
Kết quả trả về:
a35d7...8f4b ubuntu-24.04-desktop-amd64.iso
Nếu khớp → file nguyên vẹn, chưa ai sửa.
Nếu khác → đừng dùng. File bị can thiệp ở đâu đó — có thể hacker đã thay thế file gốc bằng file đã nhúng mã độc.
Tại sao hash đảm bảo được điều này?
Vì tính chất avalanche effect: thay 1 byte trong file 4GB → hash đổi hoàn toàn. Hacker không thể sửa file mà không làm hash thay đổi. Và hacker cũng không thể tạo ra một file độc hại mà vẫn có cùng hash với file gốc — đó là tính chất collision resistant.
Ứng dụng này có ở khắp nơi:
npm install— npm kiểm tra hash của package trước khi càidocker pull— Docker kiểm tra hash của mỗi layer imagegit commit— mỗi commit trong Git có một hash SHA-1/SHA-256 định danh duy nhất- Phần mềm diệt virus — so hash file với database virus đã biết
Phần 7 — Ứng dụng thực tế số 3: Git dùng hash như thế nào
Nếu Bạn dùng Git, Bạn đang xài hash mỗi ngày mà không để ý.
Mỗi lần git commit, Git tính hash của:
Nội dung commit + Hash của commit trước + Tên tác giả + Timestamp
Kết quả là một hash như 3a4b8c... — đó chính là commit ID Bạn thấy.
Tại sao không thể sửa lịch sử Git?
Giả sử Bạn commit A → commit B → commit C.
commit A: hash = aaa111
commit B: hash = SHA-256(nội dung B + hash của A) = bbb222
commit C: hash = SHA-256(nội dung C + hash của B) = ccc333
Bây giờ Bạn muốn quay về sửa commit A (ví dụ xóa API key vô tình commit lên). Khi sửa A:
- Hash của A thay đổi → hash mới là
aaa999 - Nhưng B được tính từ hash cũ của A (
aaa111) → hash của B cũng thay đổi →bbb888 - C được tính từ hash cũ của B → C cũng thay đổi
Tức là sửa một commit → toàn bộ chuỗi phía sau thay đổi theo. Đây là lý do tại sao git push --force sau khi rebase là nguy hiểm — Bạn đang viết lại lịch sử, và người khác đang làm việc trên lịch sử cũ sẽ bị conflict.
Đây cũng là lý do tại sao git log --oneline cho Bạn thấy mỗi commit có một hash riêng — nó là "dấu vân tay" của toàn bộ lịch sử đến điểm đó.
Phần 8 — Ứng dụng thực tế số 4: Bitcoin và Proof of Work
Bitcoin dùng SHA-256 theo cách thú vị hơn — không chỉ để hash mà còn để tạo ra cơ chế đồng thuận (consensus) không cần ai tin tưởng ai.
Blockchain là gì thực sự?
Mỗi "block" trong Bitcoin chứa:
- Danh sách giao dịch (ai gửi bao nhiêu BTC cho ai)
- Hash của block trước
- Một con số gọi là nonce
Hash của block = SHA-256(SHA-256(toàn bộ nội dung block))
Bitcoin dùng SHA-256 hai lần — gọi là double-SHA-256.
Tại sao không thể giả mạo lịch sử?
Giống Git, mỗi block chứa hash của block trước:
Block 1 → hash: 00000abc...
Block 2 (chứa hash block 1) → hash: 00000def...
Block 3 (chứa hash block 2) → hash: 00000ghi...
Bạn muốn sửa block 1 (ví dụ: thêm 10 BTC vào tài khoản của mình)? Hash của block 1 thay đổi → block 2 không còn hợp lệ → block 3 không còn hợp lệ → toàn bộ chuỗi sau đó bị vô hiệu.
Và ngay lập tức toàn bộ mạng lưới Bitcoin (hàng nghìn máy đang chạy) sẽ từ chối chuỗi giả mạo đó.
Proof of Work — Tại sao đào Bitcoin tốn điện?
Mỗi block cần có hash bắt đầu bằng một số lượng số 0 nhất định, ví dụ:
Hash hợp lệ: 00000000000000...xyz (bắt đầu bằng 18 số 0)
Muốn được hash như vậy, miner phải thử thay đổi nonce (một con số tự do trong block) liên tục:
SHA-256(block + nonce=0) → hash không bắt đầu bằng đủ số 0 → thử tiếp
SHA-256(block + nonce=1) → vẫn chưa → thử tiếp
SHA-256(block + nonce=2) → vẫn chưa → thử tiếp
...
SHA-256(block + nonce=4821037) → bắt đầu bằng 18 số 0! → tìm ra rồi!
Tại sao không thể tính tắt? Vì SHA-256 là one-way — không có cách nào tính ngược từ "hash cần bắt đầu bằng N số 0" để ra nonce cần dùng. Chỉ có thể thử từng cái một.
Càng nhiều số 0 yêu cầu → càng khó → miner cần thử nhiều hơn → tốn nhiều điện hơn. Bitcoin điều chỉnh độ khó mỗi 2 tuần để đảm bảo trung bình 10 phút mới có một block mới được đào.
Phần 9 — Ứng dụng thực tế số 5: JWT Token trong lập trình web
Cái này cho những bạn hay làm web backend. Khi user đăng nhập, server phải "nhớ" họ qua các request tiếp theo — nhưng HTTP là giao thức stateless, không tự nhớ gì.
Giải pháp cũ: session — lưu thông tin user trên server, gắn một session ID vào cookie.
Giải pháp mới hơn: JWT (JSON Web Token) — dùng HMAC-SHA256 để ký token, không cần lưu gì trên server.
JWT trông như thế nào?
eyJhbGciOiJIUzI1NiJ9.eyJ1c2VySWQiOjEyMywicm9sZSI6InVzZXIifQ.Xf3v2...
Ba phần ngăn bởi dấu chấm:
- Header (base64):
{"alg":"HS256"}— thuật toán dùng là HMAC-SHA256 - Payload (base64):
{"userId":123,"role":"user"}— thông tin user - Signature:
HMAC-SHA256(header + "." + payload, secret_key)
Tại sao user không thể giả mạo?
Giả sử Bạn muốn nâng quyền từ "role":"user" thành "role":"admin". Bạn decode payload, sửa, encode lại → nhưng signature không khớp vì Bạn không có secret_key của server.
Server nhận token → tính lại signature từ header + payload + secret_key → so với signature trong token → không khớp → từ chối.
Server không cần lưu bất kỳ thứ gì vào database để xác thực — chỉ cần secret key. Đây là lý do JWT được dùng nhiều trong hệ thống microservices và stateless API.
Phần 10 — HTTPS và chữ ký số
Lần tới khi Bạn thấy cái ổ khóa xanh trên trình duyệt, đó là HTTPS — và SHA-256 là một phần quan trọng trong đó.
Khi trình duyệt kết nối với https://google.com, nó cần xác thực: "Đây có thật sự là Google không, hay hacker đang giả mạo?"
Certificate của Google được cấp bởi một Certificate Authority (CA) — ví dụ DigiCert. DigiCert ký certificate đó bằng chữ ký số, cụ thể:
Chữ ký = RSA_Encrypt(SHA-256(nội dung certificate), private_key của DigiCert)
Trình duyệt của Bạn biết public key của DigiCert (cài sẵn trong hệ điều hành). Nó:
- Tính SHA-256 của certificate nhận được
- Decrypt chữ ký bằng public key DigiCert → ra hash gốc
- So sánh: nếu khớp → certificate hợp lệ, đây thật sự là Google
Nếu hacker giả mạo certificate, hash sẽ không khớp → trình duyệt cảnh báo ngay.
SHA-256 ở đây đóng vai trò là "đại diện rút gọn" của toàn bộ nội dung certificate — thay vì ký vào file lớn, Bạn chỉ cần ký vào 64 ký tự hash.
Phần 11 — SHA-256 so với các thuật toán hash khác
Không phải mọi hàm hash đều như nhau.
MD5 — Đã chết, không nên dùng
Ra đời năm 1992, tạo hash 32 ký tự (128 bit). Từ năm 2004, các nhà nghiên cứu đã tìm ra cách tạo collision có chủ đích — tức tạo hai file hoàn toàn khác nhau nhưng có cùng hash MD5.
Năm 2008, một nhóm hacker dùng collision MD5 để giả mạo certificate SSL — thuyết phục trình duyệt rằng một CA giả là CA thật. Sau đó MD5 bị loại khỏi mọi ứng dụng bảo mật nghiêm túc.
Hiện tại MD5 vẫn được dùng cho những thứ không liên quan đến bảo mật — ví dụ check xem file có bị hỏng khi tải về không (vì corruption ngẫu nhiên sẽ không có cùng MD5, chỉ collision có chủ đích mới đáng lo).
SHA-1 — Gần chết
Tạo hash 40 ký tự (160 bit). Từ lâu đã có lý thuyết cho thấy SHA-1 yếu hơn lý thuyết. Đến năm 2017, Google thực hiện SHAttered attack — lần đầu tiên tạo ra hai file PDF khác nhau có cùng SHA-1. Tốn 9 quintillion (9 × 10¹⁸) phép tính SHA-1.
Git đang dần chuyển từ SHA-1 sang SHA-256 (gọi là Git object format 2).
Chrome và Firefox đã ngừng chấp nhận certificate ký bằng SHA-1 từ 2017.
SHA-256 — Tiêu chuẩn hiện tại
Tạo hash 64 ký tự (256 bit). Thuộc họ SHA-2, được NIST chuẩn hóa năm 2001. Chưa có collision nào được tìm thấy. Đang được dùng rộng rãi trong TLS 1.3, Bitcoin, code signing, v.v.
SHA-3 — Thế hệ mới
Hoàn toàn khác kiến trúc SHA-2 (dùng Keccak sponge construction thay vì Merkle-Damgård). Ra đời năm 2015 như một "kế hoạch dự phòng" phòng khi SHA-2 bị phá vỡ. Chưa được dùng rộng rãi vì SHA-2 vẫn an toàn và SHA-3 chậm hơn.
bcrypt và Argon2 — Dành riêng cho mật khẩu
Đây không phải hash thông thường mà là password hashing function — được thiết kế cố ý chậm.
- bcrypt: có "cost factor" điều chỉnh độ chậm. Cost=12 nghĩa là hash tốn khoảng 250ms — chậm đủ để brute-force mất hàng năm, nhưng user không nhận ra khi đăng nhập.
- Argon2 (winner of Password Hashing Competition 2015): chậm + tốn RAM — chống cả GPU và ASIC brute-force. Đây là lựa chọn tốt nhất hiện tại.
Luật chung: không bao giờ dùng SHA-256 thuần để lưu mật khẩu.
Phần 12 — Câu hỏi hay gặp
Máy tính lượng tử có phá được SHA-256 không?
Máy tính lượng tử với thuật toán Grover có thể giảm độ an toàn từ 256 bit xuống còn 128 bit — vẫn cực kỳ an toàn trong nhiều thập kỷ tới. SHA-256 không bị đe dọa bởi lượng tử theo cách RSA bị đe dọa (RSA dùng toán số học có thể bị phá bởi thuật toán Shor).
Tại sao output luôn là 64 ký tự, không nhiều hơn?
Vì SHA-256 được thiết kế để output luôn là 256 bit = 32 byte. Mỗi byte được biểu diễn bằng 2 ký tự hex (00-ff). 32 × 2 = 64. Cố định.
SHA-256 có thể bị đảo ngược bằng AI không?
Không. Đây là hiểu lầm phổ biến. AI học pattern từ data, nhưng SHA-256 không có pattern nào để học — mỗi thay đổi 1 bit trong input tạo ra output hoàn toàn ngẫu nhiên. Không có mối tương quan giữa input và output mà AI có thể khai thác.
Tại sao gọi là SHA-256?
256 là số bit trong output. SHA-2 còn có các biến thể: SHA-224 (224 bit), SHA-384 (384 bit), SHA-512 (512 bit). SHA-256 phổ biến nhất vì cân bằng tốt giữa bảo mật và tốc độ.
Mình có thể tự implement SHA-256 không?
Hoàn toàn có thể — spec của nó được NIST công bố công khai, cực kỳ chi tiết. Nhưng trong thực tế đừng tự implement cho mục đích production — dùng thư viện chuẩn (crypto trong Node.js, hashlib trong Python). Tự implement dễ có lỗi tinh tế gây lỗ hổng bảo mật.
Tóm lại — Những điều cần nhớ
Nếu Bạn chỉ có 2 phút, đây là những điều quan trọng nhất:
SHA-256 là gì: Một hàm toán học biến mọi input thành chuỗi 64 ký tự cố định. Không đảo ngược. Thay 1 bit → hash đổi hoàn toàn.
Dùng ở đâu: Lưu mật khẩu (dạng hash, không phải plaintext), xác thực file, Git commit ID, blockchain, JWT token, chữ ký số HTTPS.
Không nên nhầm lẫn: SHA-256 ≠ mã hóa (encryption). Mã hóa có thể giải mã, hash thì không. SHA-256 thuần ≠ đủ để lưu mật khẩu an toàn — cần bcrypt/Argon2.
Không bao giờ dùng: MD5 cho bất kỳ mục đích bảo mật nào. SHA-1 cho certificate hoặc chữ ký số.
Nếu Bạn muốn đào sâu hơn, có thể tìm hiểu về: HMAC (dùng SHA-256 để xác thực message), Merkle Tree (cấu trúc dữ liệu dùng hash để xác thực tập hợp lớn), hay thử tự đọc RFC 6234 — spec chính thức của SHA-256, viết khá dễ hiểu so với mặt bằng chung của RFC.
All rights reserved