Giới thiệu
MySQL cung cấp hàm SHA2(str, bit_length) để tính hash SHA-2 (224, 256, 384, 512 bit). Bài viết demo chuyển đổi cột mật khẩu đã hash MD5 sang SHA256 bằng cách hash lại chuỗi hex MD5.
⚠️ Cảnh báo bảo mật quan trọng
Cách làm trong bài viết (hash lại chuỗi hex MD5) KHÔNG AN TOÀN và KHÔNG ĐÚNG về mặt mật mã học.
- MD5(‘password’) tạo ra hash 128-bit (32 ký tự hex).
- SHA2(MD5(‘password’), 256) hash chuỗi hex đó → kết quả không phải SHA256(‘password’).
- Kẻ tấn công có thể tấn công từ điển trên chuỗi hex MD5 (chỉ 32 ký tự hex) dễ dàng hơn mật khẩu gốc.
Cách đúng để nâng cấp hash mật khẩu
- Khi user đăng nhập thành công: Verify mật khẩu bằng MD5 cũ → nếu đúng, tính
SHA2(password, 256)từ mật khẩu gốc → lưu hash mới + cột flaghash_version = 2. - Đánh dấu hash cũ: Thêm cột
hash_algo VARCHAR(20) DEFAULT 'md5'. - Xóa hash MD5 cũ sau khi tất cả user đã đăng nhập lại (hoặc ép reset mật khẩu).
Ví dụ minh họa (chỉ để hiểu hàm SHA2)
1. Tạo bảng DemoTable818
mysql> CREATE TABLE DemoTable818 (UserPassword TEXT);
2. Chèn hash MD5
mysql> INSERT INTO DemoTable818 VALUES (MD5('John_123')), (MD5('999Carol@22'));
3. Hash lại chuỗi hex MD5 bằng SHA2-256 (KHÔNG KHUYẾN NGHỊ)
mysql> UPDATE DemoTable818 SET UserPassword = SHA2(UserPassword, 256);
4. Kết quả (chỉ mang tính demo hàm)
+------------------------------------------------------------------+
| UserPassword |
+------------------------------------------------------------------+
| 8b68c46294a9ccb2449324c24fe774f95b7c14e4b56fc51c7f8e6c5b01c7020f |
| 9cc80741546051ae3de7d31246327968c98af3c65125376acb7b49a0760d42a3 |
+------------------------------------------------------------------+
Hàm hash khác trong MySQL
SHA2(str, 256)— SHA-256 (khuyến nghị).SHA2(str, 512)— SHA-512.SHA1(str)— SHA-1 (đã yếu).MD5(str)— MD5 (rất yếu, không dùng cho mật khẩu).PASSWORD(str)— Hàm nội bộ MySQL (deprecated, removed 8.0).
Khuyến nghị tốt nhất
- Dùng
bcrypt,argon2,scrypt(cần thư viện ngoài, không có sẵn trong MySQL). - Không tự implement crypto trong SQL. Xử lý hash/verify ở tầng ứng dụng (PHP, Node, Java, Python...).