SHA-256 generate & verify: checksum file và chữ ký API【2026】
SHA-256 dùng để generate rồi verify — không phải để “giải mã”. Cùng bytes → cùng 64 ký tự hex; lệch 1 bit → digest khác hoàn toàn. File tải về: so checksum vendor. API / webhook: hash đúng chuỗi canonical rồi đối chiếu fixture. Làm nhanh trên trình duyệt (không upload) với công cụ hash SHA-256 Kawa. Cần phân biệt hash với encryption / mật khẩu → Hash ≠ mã hóa.
Khi tích hợp payment gateway, S3 pre-signed URL, hoặc webhook nội bộ, lỗi hay gặp nhất không phải “không biết SHA-256 là gì” — mà là digest của bạn ≠ digest server, dù mắt thường thấy chuỗi gần giống. Freelance / outsource Việt Nam hay mất nửa ngày vì CRLF từ Windows, UTF-8 BOM, hoặc copy thiếu ký tự cuối checksum.
Bài này đi theo góc generate → verify: tạo digest đúng, đối chiếu file và API, và checklist khi lệch. Không lặp bài khái niệm hash vs mã hóa.
Bài viết này giúp bạn
- Biết độ dài hex của SHA-256 / 384 / 512 và đọc đúng spec
- Quy trình verify checksum file tải về (CLI + đối chiếu)
- Debug chữ ký API khi signature mismatch
- Tránh 6 lỗi bytes ẩn làm đổi digest
- Dùng hash local làm “nguồn đúng” trước khi đổ lỗi cho thư viện
SHA-256 trong quy trình generate / verify
SHA-256 (Secure Hash Algorithm, 256 bit) là hàm một chiều: input bất kỳ → digest cố định 64 ký tự hex. Không có khóa giải mã. Mục đích thực tế:
| Mục tiêu | Cách dùng SHA-256 |
|---|---|
| Toàn vẹn file | Publisher công bố checksum → bạn hash local → so khớp |
| Fingerprint nội dung | Cache key, content addressing, Git object (SHA-1 lịch sử; nhiều hệ thống mới dùng SHA-256) |
| Chữ ký / HMAC bước băm | Hash chuỗi canonical rồi gắn header (thường kèm HMAC-SHA256) |
| Fixture unit test | Cố định input → digest vàng để regression |
Không dùng SHA-256 trần để lưu mật khẩu đăng nhập — quá nhanh cho brute-force. Password → Argon2/bcrypt.
Độ dài output — kiểm tra spec trong 5 giây
| Thuật toán | Bit / hex | Khi nào gặp |
|---|---|---|
| SHA-256 | 256 bit / 64 hex | Checksum release, nhiều API signature, TLS/cert fingerprint |
| SHA-384 | 384 bit / 96 hex | Protocol yêu cầu dài hơn SHA-256 |
| SHA-512 | 512 bit / 128 hex | Một số chuẩn nội bộ, JWT/hash dài |
Ví dụ cố định (UTF-8, không newline cuối) — dùng làm sanity check tool/CLI:
Input: password123
SHA-256: ef923407a0e3f2d7c698b53ba500ef70004811034445cc85ec0da64290df46cf
SHA-384: 22539697a3e6f7d1c970b52009306499749748790730ed91c48eb7ec22406841297c03846666a6e5f9d82735b061ef98
SHA-512: 1173539937508590107558da93ed600c81cf45ba9ccbc3aee1f0e6d30b0203937998496be1df315101039614661302319002358c3481ed1333ef7a2f40e0d4b9
Mở hash Kawa, gõ password123 — nếu SHA-256 khớp dòng trên, môi trường trình duyệt của bạn tính đúng. Đây là bước “oracle” trước khi debug code riêng.
Verify checksum file tải về
Kịch bản: tải sdk-v2.3.1.zip từ trang vendor hoặc mirror. Trang chính công bố:
SHA-256: a3f1… (64 hex)
Quy trình an toàn
- Lấy checksum từ kênh tin cậy (HTTPS vendor), không chỉ từ forum/Telegram.
- Hash file local — không giải nén trước nếu checksum của bản zip/tar.
- So khớp đủ 64 ký tự (bỏ qua hoa/thường).
- Khớp → byte trùng với thứ vendor đã hash. Chưa khớp → tải lại hoặc đổi nguồn; đừng chạy installer.
Lệnh nhanh theo OS
# Linux / macOS / Git Bash
sha256sum sdk-v2.3.1.zip
# Windows PowerShell
Get-FileHash -Algorithm SHA256 .\sdk-v2.3.1.zip
# Windows (certutil)
certutil -hashfile sdk-v2.3.1.zip SHA256
Với chuỗi text nhỏ (manifest, license key tạm, payload JSON) có thể dán vào công cụ hash để lấy SHA-256/384/512 ngay — không cần cài gì, chạy trong trình duyệt.
Giới hạn checksum
Digest khớp không chứng minh “không malware” nếu attacker kiểm soát cả file lẫn trang checksum. Threat model cao → chữ ký GPG / Sigstore / package manager signed. Checksum vẫn rất hữu ích chống tải cụt, mirror lỗi, USB copy hỏng.
Debug chữ ký API khi SHA-256 lệch
Nhiều API yêu cầu: ghép method + path + timestamp + body (hoặc query đã sort) → SHA-256 hoặc HMAC-SHA256 → gắn header X-Signature.
Lỗi 401 “Invalid signature” gần như luôn là chuỗi canonical khác, không phải “Web Crypto hỏng”.
Workflow oracle (giảm thời gian debug)
- Đọc spec: delimiter, có/không newline cuối, timezone timestamp, URL-encode hay raw.
- Với một bộ param test cố định, tự tay ghép chuỗi canonical trên giấy / editor.
- Hash chuỗi đó bằng hash local → ghi digest vàng vào PR / test fixture.
- Cho code của bạn in ra chuỗi canonical (không chỉ digest) và so với bước 2 bằng diff.
- Chỉ khi chuỗi đã khớp mà digest vẫn lệch mới nghi nhầm thuật toán (SHA-256 vs SHA-512) hoặc encoding.
Ví dụ tối giản (minh họa — không phải spec thật của một vendor):
Canonical: GET\n/v1/orders\n1700000000
Hash SHA-256 chuỗi trên (đúng \n, không \r\n) → lấy 64 hex → so với output crypto.createHash('sha256') hoặc crypto.subtle.digest.
Case study: CRLF từ Windows
Dev trên Windows copy payload từ Notepad → file có \r\n. Spec server dùng LF. Hai chuỗi nhìn giống trong UI, digest hoàn toàn khác. Fix: normalize replace(/\r\n/g, '\n') trước khi hash, hoặc lưu fixture với .gitattributes text eol=lf.
Case study: tiếng Việt / UTF-8
Chuỗi hóa đơn — nếu một bên encode UTF-8, bên kia vô tình UTF-16 hoặc Latin-1, SHA-256 lệch. Với tiếng Việt trong JSON body: luôn Buffer.from(str, 'utf8') / TextEncoder trước khi digest. Paste vào tool trình duyệt cũng dùng UTF-8 — khớp Node/Web Crypto nếu cùng code points.
6 lỗi làm đổi digest (checklist)
| Nguyên nhân | Triệu chứng | Cách xử lý |
|---|---|---|
| CRLF vs LF | Giống mắt thường, lệch hex | Normalize newline theo spec |
| Trailing space / \n thừa | Copy từ Slack/email | Trim có chủ đích; đừng trim nếu spec giữ khoảng trắng |
| Sai thuật toán | 128 hex mà spec bảo SHA-256 | Đổi về SHA-256 (64 hex) |
| Hex hoa/thường | So sánh string case-sensitive fail | So sánh lowercase hoặc constant-time equal |
| Thứ tự query | a=1&b=2 vs b=2&a=1 | Sort key đúng quy tắc vendor |
| Hash nhầm object | JSON đã stringify khác khoảng trắng | Hash raw body bytes đã gửi, không hash object đã parse lại |
Đưa checklist này vào PR template khi team hay tích hợp webhook — reviewer hỏi “đã so canonical string chưa?” trước khi nghi SDK.
Cách dùng công cụ hash Kawa (local)
- Mở /vi/tools/hash/ — không cần đăng ký.
- Dán đúng chuỗi canonical hoặc text cần fingerprint (che PII nếu share màn hình).
- Sao chép SHA-256 (hoặc 384/512 nếu spec yêu cầu).
- Đối chiếu với output code / checksum vendor.
Tool tính trong trình duyệt qua Web Crypto — phù hợp debug nhanh hơn upload chuỗi chứa token lên “hash online” lạ. Giới hạn: input là text; file binary lớn nên dùng sha256sum / Get-FileHash. Không thay Argon2 cho mật khẩu user.
Khi nào đọc bài nào
| Nhu cầu | Bài |
|---|---|
| Generate / verify SHA-256, debug API & checksum | Bài này |
| Hash ≠ encryption, MD5, password hashing | Hash ≠ mã hóa (SHA-256) |
| MD5 legacy / “decrypt” myth | MD5 hash |
| Tạo digest ngay | Công cụ hash |