Initializing, please wait a moment

MD5 vs SHA-256 - khi nào dùng mỗi hàm băm


MD5 và SHA-256 đều tạo ra đầu ra có độ dài cố định từ bất kỳ đầu vào nào, nhưng chỉ SHA-256 an toàn trước đối đầu thủ địch. Khả năng chống va chạm của MD5 thất bại năm 2004. Với chữ ký số, hãy dùng SHA-256. Với kiểm tra toàn vẹn không đối địch, MD5 vẫn ổn.


Một hàm băm thực sự làm gì

Một hàm băm biến mọi đầu vào thành văn bản độ dài cố định: cùng byte luôn cho cùng digest, và đổi một bit sẽ đổi toàn bộ kết quả.

MD5 trả về 128 bit (32 ký tự hex). SHA-256 trả về 256 bit (64 ký tự hex). Cả hai đều xác định. Cả hai đều nhanh. Cả hai không tiết lộ gì về khôi phục đầu vào từ đầu ra.


So sánh cạnh nhau

MD5 là 128-bit và đã bị phá collision; SHA-256 là 256-bit và vẫn là mặc định cho toàn vẹn và chữ ký năm 2026.

See MD5 at a glance: 128-bit digest, designed 1991 by Ron Rivest, MD4 lineage, and known collision resistance breaks.
MD5 at a glance: four key properties before you decide whether to use it or SHA-256.
Thuộc tínhMD5SHA-256
Độ dài digest128 bit (32 ký tự hex)256 bit (64 ký tự hex)
Thiết kế1991 (Ron Rivest)2001 (NSA, FIPS 180-2)
Gia đìnhdòng MD4gia đình SHA-2
Kháng va chạmBị phá từ 2004 (Wang et al.); va chạm thực tế trong vài giâyKhông biết va chạm thực tế; ~2128 phép tính để tìm một
Kháng preimage thứ haiYếu đi nhưng không có tấn công thực tế cho đầu vào đã tính trướcMạnh; ~2256 phép tính
Tốc độ (x86-64 hiện đại)~500 MB/s mỗi lõi~300 MB/s mỗi lõi (SHA-NI: ~1,5 GB/s)
Tăng tốc phần cứngKhông có lệnh chuyên biệtIntel SHA-NI, mở rộng crypto ARMv8
An toàn cho sử dụng mã hóaKhông - không dùng cho chữ ký, cert pinning, băm mật khẩuCó (ngoại trừ băm mật khẩu - dùng Argon2id/bcrypt cho mật khẩu)

Tại sao MD5 bị phá và điều đó thực sự có nghĩa gì

Kẻ tấn công có thể tạo hai tệp khác nhau cùng một MD5, nên riêng một MD5 trùng khớp không chứng minh được tệp bạn tải xuống còn nguyên vẹn.

Kháng preimage thứ hai của MD5 yếu hơn SHA-256 nhưng không có tấn công thực tế biết để khôi phục đầu vào từ mà đã tồn tại. Đó là lý do tại sao MD5 vẫn an toàn: xác nhận rằng một digest đã tính trước khớp với một tệp bạn đã tải, khi không có kẻ thứ nào có cơ hội tạo va chạm khôi phục tệp cụ thể đó.


Khi nào MD5 vẫn ổn

Checksum nhanh không có yêu cầu bảo mật, manifest cũ và việc bắt lỗi hỏng ngẫu nhiên đều là những trường hợp không ai tấn công đầu vào, nên MD5 vẫn dùng được.

Cache loại bỏ trùng lặp. Một proxy cache lập chỉ mục đối tượng bằng MD5 của nội dung để phát hiện lặp lại. Va chạm trong bối cảnh này vô hại - hai đối tượng khác với cùng MD5 nghĩa là một lần trượt cache, không hệ quả đối đầu.

Đầu ra cho hàng có sẵn dữ liệu. "Bản ghi này có thể đổi từ lần công bố cuối không?" - băm MD5 hàng, so sánh với digest đã lưu. Nhanh hơn SHA-256; mô hình đối kháng vắng mặt.

Địa chỉ nội dung Git. Git dùng SHA-1 (sớm SHA-256), không phải MD5 - nhưng lý do thiết kế áp dụng: cho một kho lưu được địa chỉ nội dung mà bạn tin người ghi, một băm 128-bit đủ nếu va chạm không là vector tấn công.


Khi nào SHA-256 là lựa chọn duy nhất

Hash bạn phát hành, chuỗi chứng chỉ, đối tượng Git và mọi trường hợp bên thứ ba có thể giả mạo MD5 thông qua collision đều cần SHA-256.

Cert pinning và đầu ra khóa công khai. Đầu ra SHA-256 của khóa công khai của chứng chỉ là tiêu chuẩn cho pinning.

Blockchain và lưu trữ có thể địa chỉ nội dung mà đối kháng thẩm giá. Bitcoin dùng SHA-256 hai lần (SHA-256d) cho tiêu đề khối và định danh giao dịch. Bất kỳ kho lưu nào mà người dùng đóng góp nội dung và va chạm có thể bị lợi dụng cần SHA-256.

HMAC cho xác thực tin nhắn. HMAC-SHA-256 là đường cơ sở cho ký yêu cầu API (AWS Signature v4, GitHub webhooks, Stripe). HMAC-MD5 vẫn dùng trong một số giao thức cũ nhưng ngày càng bị khuyến cáo bởi máy quét tuân thủ.


Cái gì dùng cho mật khẩu (spoiler: không cái nào)

Mật khẩu cần một hash mật khẩu chậm, có salt, như Argon2id hoặc bcrypt. Không MD5 hay SHA-256 trần của chuỗi mật khẩu nào là cách lưu chấp nhận được.


Thực tế hiệu suất trong 2026

Cả hai thuật toán xử lý tệp lớn trong trình duyệt trong vài giây, nên hãy chọn SHA-256 vì tính tin cậy của nó, không phải vì MD5 nhanh hơn ở các lần tải lên thông thường.

JavaScript trong trình duyệt với WebCrypto (crypto.subtle.digest('SHA-256', data)) đạt ~200 MB/s trên laptop hiện đại. Công cụ chuyển đổi MD5 của chúng tôi chạy MD5 với tốc độ tương tự qua triển khai wasm.


MD5 hoặc SHA-256: quy tắc ranh giới tin cậy

Lựa chọn giữa MD5 và SHA-256 phụ thuộc vào một câu hỏi duy nhất - liệu một kẻ thứ có thể ảnh hưởng đầu vào bạn đang băm. Nếu một người upload từ xa, một kẻ tấn công mạng, hoặc bất kỳ bên nào ngoài ranh giới tin cậy của bạn có thể định hình các byte đến hàm băm, chọn SHA-256 (hoặc SHA-3, hoặc BLAKE3) để một tấn công va chạm không thể giả mạo một digest khớp. Nếu đầu vào đến từ pipeline của bạn và bạn đang đầu ra chúng cho cache, loại bỏ trùng lặp, hoặc phát hiện thay đổi, MD5 ổn và chạy nhanh hơn một chút trên CPU không có SHA-NI. Quyết định là nhị phân và sống tại ranh giới tin cậy; một khi bạn đã gọi tên bên nào của ranh giới đó đầu vào nằm, thuật toán để dùng được quyết định.


Công cụ liên quan


← Quay lại Developer Tools