Trình tạo Hash MD5
Tạo hash MD5 từ bất kỳ văn bản nào
Văn bản nhập
Hash MD5
Hash MD5 sẽ xuất hiện ở đây…
MD5 Hashing là gì?
MD5 (Message-Digest Algorithm 5) là hàm băm mật mã tạo ra giá trị băm cố định 128-bit (16 byte) từ bất kỳ đầu vào nào, bất kể kích thước. Được công bố năm 1992 bởi Ronald Rivest dưới dạng RFC 1321, MD5 được thiết kế như phiên bản kế thừa nhanh hơn của MD4 và nhanh chóng trở thành một trong những hàm băm được sử dụng rộng rãi nhất trên internet. Thuật toán xử lý đầu vào theo các khối 512-bit qua bốn vòng, mỗi vòng 16 phép toán, sử dụng hàm phi tuyến khác nhau cho mỗi vòng, tạo ra chữ ký thập lục phân 32 ký tự.
Hàm băm là phép biến đổi một chiều: cho một đầu vào, bạn có thể tính toán giá trị băm ngay lập tức, nhưng chỉ có giá trị băm không thể khôi phục đầu vào gốc. Ngay cả thay đổi một bit trong đầu vào cũng tạo ra giá trị băm hoàn toàn khác — đặc tính này được gọi là hiệu ứng tuyết lở. MD5 ánh xạ không gian đầu vào vô hạn sang không gian đầu ra cố định 128-bit, vì vậy va chạm (hai đầu vào khác nhau tạo ra cùng giá trị băm) được đảm bảo tồn tại về mặt toán học, nhưng hàm băm an toàn phải làm cho việc tìm kiếm chúng không khả thi về mặt tính toán.
Từ năm 2004, các nhà nghiên cứu đã chứng minh các cuộc tấn công va chạm thực tế chống lại MD5, có nghĩa là nó không còn được coi là an toàn cho chữ ký số, chứng chỉ, hoặc bất kỳ ngữ cảnh nào yêu cầu khả năng chống va chạm. Tuy nhiên, MD5 vẫn được sử dụng rộng rãi cho các mục đích phi bảo mật: xác minh tính toàn vẹn của tệp sau khi tải xuống, tạo khóa bộ nhớ đệm, loại bỏ trùng lặp nội dung và tạo định danh xác định từ chuỗi. Đối với những ứng dụng này, tốc độ của thuật toán và sự hỗ trợ thư viện phổ biến khiến nó trở thành lựa chọn thực tế. Năm 2008, Marc Stevens và các đồng nghiệp công bố tấn công va chạm tiền tố tùy chọn, có nghĩa là kẻ tấn công có thể tạo hai tài liệu với tiền tố tùy chọn bất kỳ có cùng giá trị băm. Kỹ thuật này đã được trình diễn tại Chaos Communication Congress 2008 bằng cách xây dựng chứng chỉ Tổ chức chứng nhận giả mạo. Phần mềm độc hại Flame năm 2012 sau đó đã khai thác va chạm tiền tố tùy chọn để giả mạo chứng chỉ ký mã Microsoft, cho phép phần mềm độc hại giả dạng gói Windows Update hợp lệ. Các cuộc khai thác thực tế này xác nhận rằng thuật toán đã bị phá vỡ về mặt mật mã cho bất kỳ ứng dụng nào dựa trên sự tin cậy và không nên được tin cậy khi kẻ tấn công có thể ảnh hưởng đến các đầu vào được băm.
Tại sao sử dụng Trình tạo MD5 này?
Tạo giá trị băm MD5 ngay lập tức mà không cần cài đặt bất cứ thứ gì hay viết mã. Dán văn bản và nhận giá trị băm hex 32 ký tự theo thời gian thực.
Các trường hợp sử dụng MD5
MD5 so với các thuật toán băm khác
MD5 là thuật toán nhanh nhất và ngắn nhất trong số các thuật toán băm phổ biến, nhưng cung cấp bảo đảm an toàn yếu nhất. Bảng dưới đây so sánh kích thước giá trị băm, tiêu chuẩn và các trường hợp sử dụng phù hợp cho từng thuật toán.
| Thuật toán | Kích thước giá trị băm | Độ dài Hex | Tiêu chuẩn | Phù hợp nhất cho |
|---|---|---|---|---|
| MD5 | 128 bits | 32 hex chars | 1992 / RFC 1321 | Checksums, non-security fingerprints |
| SHA-1 | 160 bits | 40 hex chars | 1995 / RFC 3174 | Legacy git commits (being replaced) |
| SHA-256 | 256 bits | 64 hex chars | 2001 / FIPS 180-4 | TLS certificates, blockchain, JWTs |
| SHA-384 | 384 bits | 96 hex chars | 2001 / FIPS 180-4 | Government systems, higher security margin |
| SHA-512 | 512 bits | 128 hex chars | 2001 / FIPS 180-4 | Digital signatures, HMAC with large keys |
| SHA-3 | 256 bits | 64 hex chars | 2015 / FIPS 202 | Post-quantum readiness, backup standard |
| BLAKE3 | 256 bits | 64 hex chars | 2020 | High-performance checksums, Merkle trees |
MD5 hoạt động như thế nào
MD5 xử lý đầu vào qua cấu trúc Merkle-Damgård: thông điệp được đệm thành bội số của 512 bit, chia thành các khối, và mỗi khối được đưa qua bốn vòng gồm 16 phép toán bit trộn đầu vào với các hằng số dẫn xuất từ sin đã được tính trước. Kết quả là trạng thái 128-bit trở thành giá trị băm cuối cùng.
Mỗi vòng áp dụng một hàm phụ trợ phi tuyến riêng biệt cho ba trong bốn từ trạng thái 32-bit (A, B, C, D). Vòng 1 sử dụng F(B,C,D) = (B AND C) OR (NOT B AND D) — bộ chọn điều kiện bit. Vòng 2 sử dụng G(B,C,D) = (B AND D) OR (C AND NOT D) — bộ chọn bổ sung. Vòng 3 sử dụng H(B,C,D) = B XOR C XOR D — hàm chẵn lẻ. Vòng 4 sử dụng I(B,C,D) = C XOR (B OR NOT D) — bộ kết hợp bất đối xứng. Bốn hàm này đảm bảo mỗi bit của đầu vào ảnh hưởng đến giá trị băm đầu ra, tạo ra hiệu ứng tuyết lở khiến các thay đổi nhỏ trong đầu vào gây ra những thay đổi lớn và không thể đoán trước trong giá trị băm kết quả.
MD5: 5eb63bbbe01eeed093cb22bb8f5acdc3
(128 bits = 16 bytes = 32 hex characters)
Thuật toán tiến hành theo năm giai đoạn: (1) thêm bit 1, sau đó các bit 0, cho đến khi độ dài thông điệp là 448 mod 512; (2) thêm độ dài thông điệp gốc dưới dạng số nguyên 64-bit little-endian; (3) khởi tạo bốn biến trạng thái 32-bit (A, B, C, D) với các hằng số cố định; (4) xử lý mỗi khối 512-bit qua 64 phép toán sử dụng bốn hàm phi tuyến (F, G, H, I), mỗi vòng gồm 16 phép toán; (5) cộng trạng thái kết quả vào tổng cộng dồn và xuất giá trị băm 128-bit cuối cùng theo thứ tự byte little-endian.
Ví dụ mã
Cách tạo giá trị băm MD5 trong các ngôn ngữ và môi trường phổ biến. Lưu ý rằng MD5 không có sẵn trong Web Crypto API của trình duyệt — hãy sử dụng thư viện hoặc Node.js.
// MD5 is not available in Web Crypto API (it only supports SHA-*)
// Use a library like 'js-md5' or the Node.js crypto module
// Node.js (built-in crypto)
const crypto = require('crypto')
const hash = crypto.createHash('md5').update('hello world').digest('hex')
console.log(hash) // → "5eb63bbbe01eeed093cb22bb8f5acdc3"
// With Unicode input
crypto.createHash('md5').update('cafe\u0301').digest('hex')
// → "4fad076bae205e95bec9dacea498e2ab"import hashlib
# Basic MD5 hash
result = hashlib.md5(b'hello world').hexdigest()
print(result) # → "5eb63bbbe01eeed093cb22bb8f5acdc3"
# Hash a string (must encode to bytes first)
text = 'hello world'
hashlib.md5(text.encode('utf-8')).hexdigest()
# → "5eb63bbbe01eeed093cb22bb8f5acdc3"
# Hash a file
with open('file.bin', 'rb') as f:
md5 = hashlib.md5()
for chunk in iter(lambda: f.read(8192), b''):
md5.update(chunk)
print(md5.hexdigest())package main
import (
"crypto/md5"
"fmt"
)
func main() {
data := []byte("hello world")
hash := md5.Sum(data)
fmt.Printf("%x\n", hash)
// → 5eb63bbbe01eeed093cb22bb8f5acdc3
}# Using md5sum (Linux) or md5 (macOS) echo -n "hello world" | md5sum # → 5eb63bbbe01eeed093cb22bb8f5acdc3 - # macOS echo -n "hello world" | md5 # → 5eb63bbbe01eeed093cb22bb8f5acdc3 # Hash a file md5sum package.json # → a1b2c3d4e5f6... package.json # Using openssl (cross-platform) echo -n "hello world" | openssl md5 # → MD5(stdin)= 5eb63bbbe01eeed093cb22bb8f5acdc3