Băm MD5
Công cụ băm MD5 trực tuyến miễn phí. Chế độ văn bản/tệp/hàng loạt/HMAC-MD5, UTF-8/Latin1, chữ hoa, nhóm 8 ký tự. ⚠️ MD5 đã bị phá — KHÔNG sử dụng để lưu trữ mật khẩu.
Công cụ băm MD5 trực tuyến miễn phí. Chế độ văn bản/tệp/hàng loạt/HMAC-MD5, UTF-8/Latin1, chữ hoa, nhóm 8 ký tự. ⚠️ MD5 đã bị phá — KHÔNG sử dụng để lưu trữ mật khẩu.
MD5 thường được sử dụng để kiểm tra toàn vẹn tệp (ví dụ: xác minh tải xuống), tạo tóm tắt nhanh, tương thích hệ thống cũ, khóa bộ đệm và loại bỏ trùng lặp dữ liệu trong các kịch bản không liên quan đến bảo mật. MD5 tạo ra 128 bit (32 ký tự thập lục phân) và cực kỳ nhanh, phù hợp cho các kịch bản xác minh không quan trọng.
MD5 tạo ra 128 bit (32 hex), cực kỳ nhanh nhưng đã bị phá; SHA-256 tạo ra 256 bit (64 hex), chậm hơn nhưng không có tấn công va chạm thực tế và được ưu tiên cho các ứng dụng quan trọng.
Công cụ SHA-256MD5 cực kỳ nhanh — GPU hiện đại có thể tính toán hàng tỷ băm mỗi giây, và bảng cầu vồng phá vỡ các mật khẩu phổ biến ngay lập tức. Sử dụng bcrypt, scrypt hoặc Argon2 để lưu trữ mật khẩu.
Trình tạo mật khẩuTuyệt đối KHÔNG cho bảo mật (chữ ký số, mật khẩu, TLS). Nhưng cho các ứng dụng không liên quan đến bảo mật (kiểm tra hỏng tệp, loại bỏ trùng lặp, khóa bộ đệm) MD5 vẫn phù hợp, vì kẻ tấn công không có động cơ tạo va chạm.
MD5 là hàm một chiều và về mặt toán học không thể đảo ngược, nhưng bảng cầu vồng và tấn công từ điển có thể khôi phục mật khẩu yếu trong vài giây. Vì vậy MD5 không bao giờ nên được sử dụng để lưu trữ mật khẩu.
Không. Công cụ sử dụng đọc tăng dần theo phân đoạn — tệp không được tải hoàn toàn vào bộ nhớ, vì vậy ngay cả tệp nhiều gigabyte cũng được xử lý mượt mà với giao diện phản hồi.
HMAC-MD5 là băm có khóa yêu cầu khóa bí mật. Mặc dù MD5 thông thường đã bị phá, HMAC-MD5 vẫn an toàn khi khóa không được biết (mặc dù khuyến nghị chuyển sang HMAC-SHA256).
Trình tạo HMACMD5 (Message-Digest Algorithm 5) là hàm băm 128 bit được thiết kế bởi Ronald Rivest vào năm 1991 (RFC 1321), tạo ra tóm tắt thập lục phân 32 ký tự cố định từ đầu vào tùy ý. Từng được sử dụng rộng rãi cho chữ ký số, xác minh chứng chỉ và lưu trữ mật khẩu, MD5 đã bị phá bởi tấn công va chạm của Wang và cộng sự vào năm 2004, và phần mềm độc hại Flame đã lạm dụng va chạm MD5 để giả mạo chứng chỉ CA đáng tin cậy vào năm 2008.
**Trạng thái bảo mật**: NIST chính thức từ chối MD5 cho chữ ký số trong SP 800-131A (2011). Tuy nhiên, MD5 vẫn hữu ích cho các kịch bản không liên quan đến bảo mật: kiểm tra toàn vẹn tệp chống hỏng ngẫu nhiên, loại bỏ trùng lặp dữ liệu và khóa bộ đệm. Câu hỏi chính: kẻ tấn công có hưởng lợi từ việc tạo va chạm không? Nếu không, tốc độ của MD5 là một lợi thế.
**KHÔNG BAO GIỜ sử dụng MD5 để lưu trữ mật khẩu**: MD5 cực kỳ nhanh (hàng tỷ băm/giây trên GPU), cho phép phá mật khẩu phổ biến ngay lập tức bằng tấn công từ điển. Lưu trữ mật khẩu PHẢI sử dụng bcrypt, scrypt hoặc Argon2 — các hàm băm chậm với hệ số chi phí có thể điều chỉnh làm cho tấn công từ điển trở nên không khả thi.
**HMAC-MD5 vẫn an toàn**: mặc dù MD5 thông thường đã bị phá, HMAC-MD5 (Mã xác thực thông điệp dựa trên băm có khóa) vẫn an toàn khi khóa không được biết, vì cấu trúc HMAC không phụ thuộc trực tiếp vào khả năng kháng va chạm của băm cơ sở. Tuy nhiên, việc chuyển sang HMAC-SHA256 được khuyến nghị.
Công cụ sử dụng triển khai MD5 JavaScript thuần túy (Web Crypto API không còn hỗ trợ MD5). Tất cả các phép tính được thực hiện cục bộ trong trình duyệt của bạn — tệp sử dụng đọc tăng dần theo phân đoạn và không bao giờ được tải lên máy chủ.
| Thuật toán | Bit đầu ra | Độ dài Hex | Bảo mật | Tốc độ | Sử dụng đề xuất |
|---|---|---|---|---|---|
MD5 | 128 bit | 32 ký tự | ❌ Đã bị phá (va chạm/tiền ảnh) | Cực kỳ nhanh | Tổng kiểm tệp, loại bỏ trùng lặp, khóa bộ đệm |
SHA-1 | 160 bit | 40 ký tự | ❌ Va chạm (2017) | Nhanh | Git, tương thích hệ thống cũ |
SHA-256 | 256 bit | 64 ký tự | ✅ An toàn | Trung bình | Chữ ký số, chứng chỉ, blockchain |
SHA-512 | 512 bit | 128 ký tự | ✅ An toàn | Nhanh (64-bit) | Kịch bản bảo mật cao, suy ra khóa |
bcrypt | - | 60 ký tự | ✅ Chuyên biệt cho mật khẩu | Chậm (có thể điều chỉnh) | Lưu trữ mật khẩu |
| Năm | Sự kiện | Tác động |
|---|---|---|
1991 | Ron Rivest thiết kế MD5 (RFC 1321) | Thay thế MD4 và trở thành thuật toán băm tiêu chuẩn |
1996 | Phát hiện lỗi giả va chạm đầu tiên trong MD5 | Cộng đồng học thuật bày tỏ lo ngại |
2004 | Nhóm của Wang Xiaoyun trình diễn tấn công va chạm MD5 | Bảo mật chữ ký số MD5 hoàn toàn bị phá vỡ |
2008 | Phần mềm độc hại Flame giả mạo chứng chỉ CA qua va chạm MD5 | NIST chính thức từ chối MD5 cho chữ ký số |
2011 | NIST SP 800-131A chính thức cấm MD5 cho mục đích bảo mật | Hệ thống chính phủ Mỹ loại bỏ dần MD5 |
2024 | Công bố bài báo tấn công tiền ảnh mới | Phòng tuyến cuối cùng của MD5 (kháng tiền ảnh) bị phá vỡ |
// Note: Web Crypto API does NOT support MD5 (deprecated)
// Use SHA-256 instead for new projects
async function sha256(message) {
const msgBuffer = new TextEncoder().encode(message);
const hashBuffer = await crypto.subtle.digest('SHA-256', msgBuffer);
return Array.from(new Uint8Array(hashBuffer)).map(b => b.toString(16).padStart(2,'0')).join('');
}
sha256('Hello World').then(console.log);
// MD5 in Node.js using crypto module
const crypto = require('crypto');
const md5 = crypto.createHash('md5').update('Hello World').digest('hex');
console.log(md5); // b10a8db164e0754105b7a99be72e3fe5import hashlib
text = 'Hello World'
md5_hash = hashlib.md5(text.encode('utf-8')).hexdigest()
print(md5_hash) # b10a8db164e0754105b7a99be72e3fe5
# File MD5 (chunked for large files)
def md5_file(filepath, chunk_size=8192):
md5 = hashlib.md5()
with open(filepath, 'rb') as f:
while chunk := f.read(chunk_size):
md5.update(chunk)
return md5.hexdigest()
# HMAC-MD5
import hmac
hmac_md5 = hmac.new(b'secret-key', b'Hello World', hashlib.md5).hexdigest()
print(hmac_md5)import java.security.MessageDigest;
import java.nio.charset.StandardCharsets;
public class MD5Example {
public static String md5(String input) throws Exception {
MessageDigest md = MessageDigest.getInstance("MD5");
byte[] hash = md.digest(input.getBytes(StandardCharsets.UTF_8));
StringBuilder sb = new StringBuilder();
for (byte b : hash) sb.append(String.format("%02x", b));
return sb.toString();
}
public static void main(String[] args) throws Exception {
System.out.println(md5("Hello World"));
// b10a8db164e0754105b7a99be72e3fe5
}
}
// Note: Use SHA-256 for new code: MessageDigest.getInstance("SHA-256")