Trong thế giới số ngày nay, việc bảo vệ thông tin người dùng – đặc biệt là mật khẩu – là điều bắt buộc đối với mọi ứng dụng hoặc hệ thống có xác thực. Một trong những kỹ thuật cốt lõi giúp bảo vệ mật khẩu là hashing (băm). Bài viết này sẽ giúp bạn hiểu rõ:
- Mật khẩu băm là gì
- Tại sao việc băm lại quan trọng
- Phân biệt giữa băm và mã hóa
- Cách băm mật khẩu hoạt động
- Nên chọn hàm băm nào để đảm bảo an toàn
1. Mật khẩu băm là gì?
Mật khẩu băm (password hashing) là một quá trình biến đổi mật khẩu gốc thuần túy (plain text) thành một chuỗi ký tự có độ dài cố định, được gọi là "giá trị băm" gọi là hash, bằng cách sử dụng một hàm băm (hash function). Quá trình này là một chiều, nghĩa là không thể khôi phục mật khẩu gốc từ giá trị băm.
Ví dụ, nếu bạn băm chuỗi "123456" bằng hàm SHA-256, bạn sẽ nhận được:
8d969eef6ecad3c29a3a629280e686cf0c3f5d5a86aff3ca12020c923adc6c92Điều đặc biệt là:
- Với cùng một đầu vào, hàm băm luôn tạo ra cùng một kết quả.
- Nhưng từ kết quả đó, không thể biết được đầu vào là gì (tức là không thể "giải mã" được hash).
2. Băm mật khẩu hoạt động như thế nào?
Quy trình băm mật khẩu thường như sau:
- Người dùng đăng ký tài khoản với mật khẩu, ví dụ:
"abc123". - Hệ thống dùng một hàm băm (như bcrypt) để tạo ra một hash từ mật khẩu đó.
- Hash được lưu vào cơ sở dữ liệu. Không lưu mật khẩu thật!
- Khi người dùng đăng nhập, mật khẩu nhập vào cũng được băm bằng cùng hàm.
- Hệ thống so sánh hash mới tạo với hash đã lưu. Nếu khớp → đúng mật khẩu.
3. Tại sao chỉ băm thôi vẫn chưa đủ?
Người dùng thường chọn mật khẩu yếu hoặc dễ đoán. Ví dụ: "123456", "password", "admin",…
Khi đó, hacker có thể sử dụng tấn công từ điển (dictionary attack) hoặc bảng Rainbow (rainbow table) để dò hash → tìm được mật khẩu gốc.
🔐 Giải pháp: Thêm muối (salt) vào mật khẩu trước khi băm.
4. Muối (Salt) là gì?
Salt là một chuỗi ký tự ngẫu nhiên được thêm vào mật khẩu trước khi băm, ví dụ:
Mật khẩu gốc: abc123
Salt ngẫu nhiên: X9!k@2
Ghép lại: abc123X9!k@2
Sau đó mới băm.→ Mỗi người dùng có một salt khác nhau, nên mật khẩu giống nhau cũng tạo ra hash khác nhau.
Điều này ngăn chặn tấn công bằng bảng băm sẵn (rainbow tables).
5. Băm mật khẩu khác gì mã hóa?
| Tiêu chí | Băm mật khẩu (Hashing) | Mã hóa (Encryption) |
|---|---|---|
| Một chiều | ✅ Không thể đảo ngược | ❌ Có thể giải mã bằng khóa |
| Mục đích chính | So sánh, xác minh | Bảo vệ, truyền thông tin có thể giải mã |
| Khóa | Không cần | Cần khóa mã hóa và khóa giải mã |
| Ví dụ sử dụng | Lưu trữ mật khẩu | Bảo vệ dữ liệu khi truyền tải |
➡ Kết luận: Băm dùng để lưu trữ mật khẩu an toàn, mã hóa dùng để giữ bí mật thông tin có thể khôi phục được.
6. Những lý do cần sử dụng hashing mật khẩu
Hashing mật khẩu không chỉ là một lựa chọn kỹ thuật, mà là tiêu chuẩn bắt buộc trong bảo mật ứng dụng hiện đại. Dưới đây là các lý do vì sao bạn nên (và phải) sử dụng hashing khi xử lý mật khẩu người dùng:
🔐 1. Bảo mật dữ liệu người dùng
Nếu bạn lưu mật khẩu ở dạng văn bản thuần túy (plain text), một khi cơ sở dữ liệu bị rò rỉ, hacker sẽ ngay lập tức biết được tất cả mật khẩu của người dùng.
Khi mật khẩu được hash, đặc biệt với các thuật toán như bcrypt hoặc Argon2, dữ liệu sẽ ở dạng không thể đảo ngược, khiến hacker khó hoặc không thể lấy lại mật khẩu gốc.
📜 2. Tuân thủ các quy định pháp lý và tiêu chuẩn bảo mật
Nhiều quy định như:
- GDPR (Châu Âu)
- HIPAA (Y tế - Mỹ)
- PCI DSS (Thanh toán)
đều yêu cầu lưu trữ mật khẩu một cách an toàn, và hashing là cách làm được chấp nhận trong phần lớn các tình huống.
⛔ 3. Ngăn chặn tấn công từ điển và rainbow table
Nếu không hash (hoặc hash không đúng cách), hệ thống có thể bị tấn công bằng:
- Dictionary Attack: Hacker thử hàng ngàn mật khẩu phổ biến.
- Rainbow Table Attack: Hacker sử dụng các bảng băm tính trước để tra ngược mật khẩu.
→ Sử dụng hashing kết hợp salting sẽ khiến các phương pháp này vô hiệu hóa.
🛡 4. Khó bị brute-force nếu dùng thuật toán phù hợp
Các thuật toán như bcrypt, Argon2, scrypt được thiết kế để tiêu tốn tài nguyên tính toán. Điều này khiến việc thử từng mật khẩu (brute-force) trở nên rất chậm và không khả thi với số lượng lớn.
Bạn có thể cấu hình độ phức tạp (cost) của các thuật toán này, giúp tăng bảo mật theo thời gian.
🤝 5. Xây dựng uy tín và niềm tin với người dùng
Không ai muốn mật khẩu của mình bị rò rỉ – và chắc chắn không muốn dùng dịch vụ mà lưu mật khẩu plain text.
Việc sử dụng kỹ thuật hashing thể hiện rằng bạn tôn trọng và bảo vệ người dùng, từ đó tăng sự tin tưởng và uy tín cho hệ thống hoặc sản phẩm của bạn.
7. Nên chọn hàm băm nào?
Không phải tất cả các hàm băm đều phù hợp để băm mật khẩu. Dưới đây là một số hàm băm nên dùng:
| Hàm băm | Ưu điểm |
|---|---|
| bcrypt | Phổ biến nhất, dễ dùng, có salt tích hợp |
| scrypt | Khó dò bằng phần cứng (GPU, FPGA) |
| Argon2 | Hiện đại, chống lại cả tấn công tính toán cao |
| ❌ SHA-256 | Không phù hợp để băm mật khẩu (quá nhanh) |
Lưu ý: Các hàm như MD5 hoặc SHA-1 không còn an toàn và không nên sử dụng để băm mật khẩu.
8. Ví dụ đơn giản: Dùng bcrypt trong Node.js
const bcrypt = require('bcrypt');
const password = 'abc123';
bcrypt.hash(password, 10, function(err, hash) {
console.log('Hash:', hash);
// So sánh mật khẩu nhập với hash
bcrypt.compare(password, hash, function(err, result) {
console.log('Đăng nhập đúng không?', result); // true
});
});9. Ví dụ đơn giản: Dùng bcrypt trong PHP
Trong PHP, hàm password_hash() tự động thêm salt ngẫu nhiên, nên bạn không cần tự tạo salt.
PHP hỗ trợ bcrypt thông qua hàm password_hash() và password_verify() từ phiên bản PHP 5.5 trở lên.
9.1. Băm mật khẩu khi đăng ký
<?php
// Mật khẩu người dùng nhập vào
$plainPassword = 'abc123';
// Băm mật khẩu với bcrypt
$hash = password_hash($plainPassword, PASSWORD_BCRYPT);
// Giả sử bạn lưu $hash vào cơ sở dữ liệu
echo "Hash được lưu trong database: " . $hash;
?>
9.2. Kiểm tra mật khẩu khi đăng nhập
<?php
// Mật khẩu người dùng nhập khi đăng nhập
$inputPassword = 'abc123';
// Hash đã lưu trong database (ví dụ copy từ đoạn trước)
$storedHash = '$2y$10$EXAMPLEEXAMPLEEXAMPLEEXAMPLEDzzxZtK.y1SxQeAiZWxyqUpvSpNv1G'; // Thay bằng hash thực tế
// So sánh mật khẩu nhập với hash đã lưu
if (password_verify($inputPassword, $storedHash)) {
echo "✅ Mật khẩu chính xác. Đăng nhập thành công.";
} else {
echo "❌ Mật khẩu sai. Đăng nhập thất bại.";
}
?>
Hàm password_hash() sẽ luôn tạo ra một hash mới mỗi lần gọi, nhờ vào salt ngẫu nhiên.
Dùng password_verify() để xác minh, KHÔNG nên so sánh chuỗi hash bằng ==.
Tổng kết
- Băm mật khẩu là kỹ thuật bắt buộc để lưu trữ mật khẩu an toàn.
- Không bao giờ lưu mật khẩu dưới dạng plain text.
- Luôn kết hợp salt với hashing để chống tấn công rainbow table.
- Sử dụng các thuật toán hiện đại như bcrypt, Argon2.
- Hiểu rõ sự khác biệt giữa hashing và mã hóa để chọn đúng kỹ thuật.
💡 codetuthub.com – Học code từ thực chiến, dễ hiểu, dễ nhớ!
Hãy bảo vệ người dùng của bạn bằng cách bắt đầu từ... một hash tử tế.
Nếu bạn thấy bài viết hữu ích, chia sẻ cho đồng đội nhé!
📌 Bài viết thuộc chuỗi kiến thức bảo mật web trên codetuthub.com








