Đến phần nội dung
Toova
Tất cả công cụ

MD5 vs SHA-256 vs SHA-512 — Hàm Băm Được Giải Thích

Toova

Hàm băm có ở khắp mọi nơi trong phát triển phần mềm: kiểm tra tính toàn vẹn tệp, lưu trữ mật khẩu, chữ ký số, xác thực API, khóa cache, loại bỏ trùng lặp. Tuy nhiên, hầu hết nhà phát triển làm việc với chúng như hộp đen — bạn nhập một chuỗi vào, bạn nhận lại một digest hex độ dài cố định. Các chi tiết về cái nào hàm băm để dùng, và cái nào để tránh, hóa ra rất quan trọng.

MD5 bị phá vỡ. SHA-1 đã lỗi thời. SHA-256 và SHA-512 hiện an toàn. SHA-3 tồn tại nếu bạn muốn bảo mật cho tương lai. Nhưng "bị phá vỡ" không có nghĩa giống nhau trong mọi ngữ cảnh — MD5 ổn cho một số trường hợp sử dụng và thảm họa sai cho các trường hợp khác. Hướng dẫn này giải thích các thuộc tính quan trọng, mỗi hàm đứng vững như thế nào trước chúng, và cho bạn một khuôn khổ quyết định rõ ràng để chọn hàm băm phù hợp năm 2026.

Hàm Băm Thực Sự Làm Gì

Một hàm băm mật mã ánh xạ một đầu vào có độ dài tùy ý đến một đầu ra độ dài cố định (digest hoặc hash). Ba thuộc tính định nghĩa một hàm băm an toàn về mật mã:

  • Kháng preimage — cho một băm h, không khả thi về mặt tính toán để tìm bất kỳ đầu vào m nào sao cho hash(m) = h. Đây là thuộc tính "một chiều".
  • Kháng preimage thứ hai — cho một đầu vào m1, không khả thi để tìm một đầu vào khác m2 sao cho hash(m1) = hash(m2).
  • Kháng va chạm — không khả thi để tìm bất kỳ hai đầu vào riêng biệt m1m2 sao cho hash(m1) = hash(m2).

Một hàm không vượt qua bất kỳ thuộc tính nào trong số này được coi là bị phá vỡ cho việc sử dụng mật mã. Lưu ý rằng "không khả thi" có một ý nghĩa cụ thể ở đây: nó không có nghĩa là không thể về mặt toán học, nó có nghĩa là yêu cầu nhiều tính toán hơn là thực tế với phần cứng hiện tại hoặc dự kiến.

Ngoài ra, các hàm băm mật mã thể hiện hiệu ứng tuyết lở: thay đổi một bit duy nhất trong đầu vào tạo ra một đầu ra khác trong khoảng một nửa số bit. Điều này đảm bảo rằng các đầu vào tương tự tạo ra các digest hoàn toàn khác nhau.

Đầu vào:  "hello"
MD5:    5d41402abc4b2a76b9719d911017c592  (128-bit / 32 ký tự hex)

Đầu vào:  "Hello"
MD5:    8b1a9953c4611296a827abf8c47804d7  (thay đổi một ký tự = đầu ra hoàn toàn khác)

MD5 — Nhanh, Phổ Biến Và Bị Phá Vỡ

Lịch sử và thiết kế

MD5 (Message Digest 5) được thiết kế bởi Ron Rivest năm 1991 và tạo ra một digest 128-bit (16 byte). Trong hầu hết những năm 1990, nó là lựa chọn tiêu chuẩn cho xác minh tính toàn vẹn tệp, ký chứng chỉ và băm mật khẩu. Nó cực kỳ nhanh — một CPU hiện đại có thể tính hàng chục triệu băm MD5 mỗi giây, và một GPU có thể tính hàng tỷ.

Tại sao MD5 bị phá vỡ

Năm 2004, Xiaoyun Wang và các đồng nghiệp đã chứng minh một cuộc tấn công va chạm thực tế chống lại MD5 — hai tệp khác nhau tạo ra cùng băm MD5. Cuộc tấn công chạy trong vài phút trên phần cứng tiêu dùng. Năm 2008, các nhà nghiên cứu đã tạo một chứng chỉ CA giả mạo dùng một va chạm MD5, chứng minh rằng hạ tầng PKI thực tế dễ bị tổn thương. Đến năm 2012, malware Flame đã dùng một va chạm MD5 để giả mạo chứng chỉ ký mã Microsoft.

NIST đã chính thức loại bỏ MD5 cho hầu hết các mục đích mật mã. Các tổ chức cấp chứng chỉ đã ngừng cấp các chứng chỉ được ký MD5 vào năm 2009. Các nhà cung cấp trình duyệt đã loại bỏ hỗ trợ cho chữ ký chứng chỉ MD5 vào khoảng năm 2011.

Khi MD5 vẫn chấp nhận được

MD5 không phải là vô dụng phổ quát. Đối với các tổng kiểm tra không bảo mật — phát hiện hỏng dữ liệu ngẫu nhiên trong truyền tệp, đánh địa chỉ dựa trên nội dung trong một hệ thống cache nơi kẻ tấn công không thể ảnh hưởng đến các đầu vào, hoặc tạo các định danh duy nhất trong một hệ thống nội bộ đóng — MD5 vẫn đầy đủ. Kiểm tra chính: nếu một kẻ tấn công có thể hưởng lợi từ việc tạo một va chạm, không dùng MD5. Nếu chỉ có hỏng ngẫu nhiên quan trọng, MD5 ổn.

  • An toàn: loại bỏ trùng lặp nội bộ, khóa cache, phát hiện thay đổi tệp không bảo mật
  • Không an toàn: chứng chỉ, chữ ký số, băm mật khẩu, xác minh tính xác thực tệp, token bảo mật

SHA-1 — Đã Lỗi Thời, Chưa Chết Hẳn

SHA-1 tạo ra một digest 160-bit và là người kế nhiệm MD5. Nó vẫn là tiêu chuẩn cho ký chứng chỉ và ký mã trong hầu hết những năm 2000. Năm 2017, cuộc tấn công SHAttered đã chứng minh va chạm SHA-1 thực tế đầu tiên, tạo hai tệp PDF khác nhau với băm SHA-1 giống hệt nhau dùng khoảng 110 năm GPU tính toán — đắt nhưng nằm trong ngân sách quốc gia và ngày càng dễ tiếp cận.

SHA-1 đã bị NIST và tất cả các tổ chức cấp chứng chỉ chính loại bỏ. Nó không nên được dùng cho chứng chỉ, ký mã, hoặc bất kỳ ứng dụng nhạy cảm bảo mật mới nào. Một số hệ thống cũ vẫn dùng SHA-1 nội bộ, nhưng di chuyển sang SHA-256 được khuyến nghị mạnh mẽ. Git vẫn dùng SHA-1 cho đánh địa chỉ đối tượng (mặc dù chuyển tiếp SHA-256 đang được tiến hành), nhưng điều này đang bị loại bỏ dần.

SHA-256 — Tiêu Chuẩn Hiện Tại

SHA-256 là một phần của họ SHA-2, được thiết kế bởi NSA và chuẩn hóa bởi NIST trong FIPS 180-4. Nó tạo ra một digest 256-bit (32 byte). SHA-256 đã được phân tích kỹ lưỡng kể từ khi xuất bản năm 2001 và không có cuộc tấn công thực tế nào được tìm thấy. Đây là tiêu chuẩn thực tế cho:

  • Chứng chỉ TLS (về cơ bản tất cả các chứng chỉ được cấp ngày nay dùng SHA-256)
  • Ký mã (Windows Authenticode, công chứng Apple, JAR)
  • HMAC-SHA256 cho xác thực API (AWS Signature v4, xác minh webhook GitHub)
  • Chữ ký token JWT (HS256 và RS256 đều dùng SHA-256 nội bộ)
  • ID giao dịch blockchain (Bitcoin dùng SHA256 đôi)
  • Xác minh tính toàn vẹn tệp trong các trình quản lý gói (npm, pip, apt)
Đầu vào:  "hello"
SHA-256: 2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824
         (256-bit / 64 ký tự hex)

SHA-512: 9b71d224bd62f3785d96d46ad3ea3d73319bfbc2890caadae2dff72519673ca72323c3d
         99ba5c11d7c7acc6e14b8c5da0c4663475c2e5c3adef46f73bcdec043
         (512-bit / 128 ký tự hex)

Hiệu năng của SHA-256

SHA-256 dùng các phép toán word 32-bit nội bộ. Trên phần cứng 32-bit hoặc các CPU cũ không có gia tốc phần cứng, nó chậm hơn rõ rệt so với MD5. Trên các CPU 64-bit hiện đại với phần mở rộng SHA (Intel Goldmont+, AMD Zen+, Apple Silicon, ARM Cortex-A57+), SHA-256 được gia tốc phần cứng và cực kỳ nhanh — thường tiếp cận tốc độ MD5. Hầu hết các môi trường máy chủ có gia tốc phần cứng, vì vậy trong thực tế SHA-256 đủ nhanh cho hầu như mọi ứng dụng.

SHA-512 — Rộng Hơn, Đôi Khi Nhanh Hơn

SHA-512 tạo ra một digest 512-bit (64 byte) dùng các phép toán word 64-bit nội bộ. Trên phần cứng 64-bit không có phần mở rộng SHA, SHA-512 thực sự có thể nhanh hơn SHA-256 vì các phép toán 64-bit của nó sử dụng tốt hơn độ rộng thanh ghi hiện đại. Trên phần cứng có phần mở rộng SHA, SHA-256 thường nhanh hơn vì các phần mở rộng được tối ưu hóa cụ thể cho SHA-256.

SHA-512 cung cấp một biên độ bảo mật lớn hơn — kháng va chạm 256-bit so với 128-bit cho SHA-256. Đối với hầu hết các mô hình mối đe dọa hiện tại, kháng va chạm 128-bit của SHA-256 hơn cả đủ (phá nó sẽ yêu cầu khoảng 2^128 phép toán). SHA-512 phù hợp khi:

  • Bạn đang nhắm mục tiêu các máy chủ 64-bit và muốn thông lượng tối đa mà không có phần mở rộng phần cứng
  • Bạn cần các digest dài hơn làm vật liệu khóa cho các phép toán mật mã khác
  • Bạn muốn biên độ bảo mật bổ sung cho dữ liệu phải vẫn được bảo vệ qua hàng thập kỷ
  • Bạn đang triển khai các giao thức cụ thể yêu cầu SHA-512 (ví dụ, một số bộ mã TLS)

SHA-384 và SHA-512/256

SHA-384 là một phiên bản cắt ngắn của SHA-512 tạo ra 384 bit — hữu ích khi bạn muốn các phép toán nội bộ 64-bit của SHA-512 nhưng cần đầu ra ngắn hơn. SHA-512/256 là một biến thể cắt ngắn khác tạo ra đầu ra 256-bit dùng tính toán nội bộ của SHA-512. SHA-512/256 kháng các cuộc tấn công mở rộng độ dài ảnh hưởng đến SHA-256, làm cho nó hữu ích trong các ngữ cảnh nơi mở rộng độ dài là một mối lo (mặc dù HMAC đã giảm thiểu điều này trong hầu hết các kịch bản thực tế).

SHA-3 — Kiến Trúc Khác, Bảo Mật Tương Lai

SHA-3 (được chuẩn hóa trong NIST FIPS 202, 2015) dùng cấu trúc bọt biển Keccak — một thiết kế cơ bản khác với cấu trúc Merkle-Damgard của SHA-2. Điều này quan trọng vì bất kỳ điểm yếu tương lai nào được phát hiện trong thiết kế Merkle-Damgard sẽ ảnh hưởng đến MD5, SHA-1 và SHA-2 đồng thời, trong khi SHA-3 sẽ không bị ảnh hưởng.

SHA-3 hiện an toàn và là lựa chọn đúng cho các hệ thống mới cần đảm bảo dài hạn hoặc muốn phòng hộ chống lại các điểm yếu SHA-2 tương lai. Nó chậm hơn SHA-256 trong các triển khai phần mềm thuần túy. Nơi SHA-3 tỏa sáng là trong các triển khai phần cứng — thiết kế của nó rất hiệu quả trong silicon. SHA-3-256 và SHA-3-512 tạo ra các kích thước digest tương tự như các đối tác SHA-2 của chúng.

Bảng So Sánh

Thuật toán Đầu ra Kháng va chạm Trạng thái Tốc độ (SW) Dùng cho mật khẩu?
MD5 128-bit Bị phá vỡ Đã lỗi thời Rất nhanh Không bao giờ
SHA-1 160-bit Bị phá vỡ Đã lỗi thời Nhanh Không bao giờ
SHA-256 256-bit 128-bit Tiêu chuẩn hiện tại Nhanh (gia tốc HW) Không bao giờ (quá nhanh)
SHA-512 512-bit 256-bit An toàn Nhanh trên 64-bit Không bao giờ (quá nhanh)
SHA-3-256 256-bit 128-bit Bảo mật tương lai Trung bình (SW) Không bao giờ (quá nhanh)
bcrypt Chuỗi 60 ký tự N/A Chỉ mật khẩu Cố ý chậm

Băm Mật Khẩu: Một Vấn Đề Hoàn Toàn Khác

Cái này xứng đáng có phần riêng vì đó là một trong những sai lầm phổ biến nhất mà các nhà phát triển mắc phải. SHA-256 là công cụ đúng cho kiểm tra tính toàn vẹn tệp, ký API và xác minh chứng chỉ. Đó là công cụ sai để băm mật khẩu, và việc dùng nó cho mục đích đó gây ra các sự cố bảo mật thực sự.

Vấn đề là tốc độ. SHA-256 được thiết kế để nhanh — một GPU hiện đại có thể tính hàng tỷ băm SHA-256 mỗi giây. Một kẻ tấn công có được cơ sở dữ liệu mật khẩu đã băm của bạn có thể thử hàng tỷ lần đoán mật khẩu mỗi giây. Ngay cả một mật khẩu dài, ngẫu nhiên cũng có thể bị crack nhanh chóng nếu băm nhanh.

// KHÔNG BAO GIỜ làm điều này cho mật khẩu
const hash = crypto.createHash('sha256').update(password).digest('hex');
// Dùng bcrypt, scrypt hoặc Argon2 cho mật khẩu
const bcrypt = require('bcrypt');
const hash = await bcrypt.hash(password, 12);  // hệ số chi phí 12

Công cụ Bcrypt Test cho phép bạn băm và xác minh mật khẩu bcrypt trong trình duyệt. Để hiểu các hệ số chi phí bcrypt và thời gian tính toán của chúng, đó là một tham khảo hữu ích khi cấu hình hệ số làm việc của ứng dụng của bạn.

HMAC: Thêm Xác Thực Vào Một Băm

Một băm thông thường không chứng minh gì về ai đã tính nó — bất kỳ ai có dữ liệu đều có thể tính cùng băm SHA-256. HMAC (Hash-based Message Authentication Code) thêm một khóa bí mật vào tính toán, tạo ra một tag chỉ có thể được tái tạo bởi ai đó biết khóa. HMAC-SHA256 là tiêu chuẩn cho:

  • Xác minh chữ ký webhook (GitHub, Stripe, Shopify đều dùng HMAC-SHA256)
  • AWS Signature Version 4 (ký yêu cầu)
  • Token JWT HS256 (HMAC-SHA256 của header + payload)
  • Tính toàn vẹn cookie (ký các cookie phiên để ngăn ngừa giả mạo)
const crypto = require('crypto');

// Ký một thông điệp với HMAC-SHA256
const mac = crypto
  .createHmac('sha256', secretKey)
  .update(message)
  .digest('hex');

// Xác minh: so sánh trong thời gian không đổi (ngăn ngừa tấn công thời gian)
const isValid = crypto.timingSafeEqual(
  Buffer.from(mac, 'hex'),
  Buffer.from(received, 'hex')
);

Lưu ý việc sử dụng timingSafeEqual để so sánh. So sánh các giá trị MAC với kiểm tra bằng chuỗi thông thường rò rỉ thông tin thời gian có thể bị khai thác trong một cuộc tấn công thời gian. Luôn dùng một hàm so sánh thời gian không đổi khi xác minh MAC. Dùng HMAC Generator để tính các giá trị HMAC-SHA256 cho kiểm tra và gỡ lỗi mà không viết code.

Khuyến Nghị Thực Tế

Tính toàn vẹn tệp chung (tổng kiểm tra)

Dùng SHA-256. Đây là tiêu chuẩn cho xác minh gói (lockfile npm, hash yêu cầu pip, các lớp ảnh Docker). Công cụ SHA-256 Hash tính các digest SHA-256 trong trình duyệt của bạn cho đầu vào văn bản hoặc các giá trị chuỗi. Đối với các tổng kiểm tra không bảo mật nhanh nơi tốc độ quan trọng và bạn tin tưởng nguồn, MD5 vẫn chấp nhận được nhưng SHA-256 được ưa thích hơn trong bất kỳ ngữ cảnh chia sẻ hoặc tự động hóa nào.

Chứng chỉ TLS và ký mã

SHA-256 là tiêu chuẩn bắt buộc. Mọi tổ chức cấp chứng chỉ đều cấp chứng chỉ SHA-256. Không bao giờ dùng MD5 hoặc SHA-1 cho các chứng chỉ mới — chúng sẽ bị từ chối bởi các trình duyệt và hệ điều hành hiện đại.

Xác thực API

Dùng HMAC-SHA256. Đây là tiêu chuẩn đã thiết lập, được hỗ trợ tốt trong mọi ngôn ngữ, và là thuật toán được mong đợi bởi hầu hết tài liệu bảo mật API. Tính các digest với công cụ MD5 Hash hoặc công cụ SHA-256 Hash để so sánh nhanh, và tạo chữ ký HMAC với HMAC Generator.

Băm mật khẩu

Dùng bcrypt (hệ số chi phí 12+), scrypt hoặc Argon2id. Không bao giờ dùng MD5, SHA-1, SHA-256 hoặc SHA-512 trực tiếp cho mật khẩu, ngay cả với salting. Công cụ Bcrypt Test có thể giúp bạn xác minh các băm bcrypt trong quá trình phát triển.

Dữ liệu tồn tại dài hạn yêu cầu bảo mật hàng thập kỷ

Ưu tiên SHA-512 hoặc SHA-3-256. Kích thước digest lớn hơn cung cấp biên độ bổ sung chống lại những tiến bộ trong phân tích mật mã. NIST khuyến nghị SHA-512 và SHA-3 cho các ứng dụng yêu cầu bảo mật dài hạn. Xem hướng dẫn chính thức trong NIST FIPS 180-4 để có đặc tả có thẩm quyền của các thuật toán SHA-2.

Các hệ thống mới không có ràng buộc cũ

SHA-256 cho sử dụng chung. Argon2id cho mật khẩu. HMAC-SHA256 cho mã xác thực. Nếu bạn muốn bảo mật tương lai và có thể chấp nhận hiệu năng hơi thấp hơn, SHA-3-256 là một thay thế vững chắc cho SHA-256 cho băm mục đích chung.