Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> MySQL

Chuyển đổi mật khẩu MD5 sang SHA256 trong MySQL

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

  1. 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 flag hash_version = 2.
  2. Đánh dấu hash cũ: Thêm cột hash_algo VARCHAR(20) DEFAULT 'md5'.
  3. 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...).