การเตรียมข้อมูล
mysql> CREATE TABLE DemoTable1887 (
Password TEXT,
HashPassword TEXT
);
mysql> INSERT INTO DemoTable1887(Password) VALUES
('John@9089'), ('90987_Carol'), ('656464_David_4343');
อัปเดต HashPassword ด้วย MD5
mysql> UPDATE DemoTable1887 SET HashPassword = MD5(Password);
Query OK, 3 rows affected
ผลลัพธ์
+-------------------+----------------------------------+
| Password | HashPassword |
+-------------------+----------------------------------+
| John@9089 | 7f92a7e09ab1a0cd3f36ec164f035c9a |
| 90987_Carol | 1578fa8c47f0e53a898c8ada5c0111b4 |
| 656464_David_4343 | e5ec2bd2cb55b2252be7ca9eb546659e |
+-------------------+----------------------------------+
ฟังก์ชัน Hash ใน MySQL
| ฟังก์ชัน | Output Length | ความปลอดภัย | ใช้งาน |
| MD5() | 32 Hex (128-bit) | แตกได้ (Broken) | Checksum, Non-crypto |
| SHA1() | 40 Hex (160-bit) | อ่อนแอ | Legacy |
| SHA2(str, 256) | 64 Hex (256-bit) | ปลอดภัย | แนะนำ |
| SHA2(str, 512) | 128 Hex (512-bit) | ปลอดภัยมาก | High Security |
แฮชรหัสผ่านอย่างถูกต้อง (Password Hashing)
-- MySQL 8.0+ ใช้ฟังก์ชันเฉพาะ (ไม่ใช่ MD5/SHA2 ตรงๆ)
-- แฮช
SET @hash = SHA2(CONCAT('password', 'salt'), 256);
-- หรือใช้ Application Layer (bcrypt, Argon2, PBKDF2)
-- MySQL ไม่มี Built-in Bcrypt
Salt และ Pepper
-- เพิ่ม Salt ก่อน Hash
UPDATE users SET password_hash = SHA2(CONCAT(password, salt), 256);
-- เก็บ Salt แยกต่างหาก
ALTER TABLE users ADD COLUMN salt VARCHAR(32);
UPDATE users SET salt = SUBSTRING(MD5(RAND()), 1, 16);
UPDATE users SET password_hash = SHA2(CONCAT(password, salt), 256);
ข้อควรระวัง
- MD5 ไม่ปลอดภัยสำหรับรหัสผ่าน - ใช้ SHA2 หรือ Bcrypt/Argon2 ใน Application Layer
- ใช้ Salt ทุกครั้ง ป้องกัน Rainbow Table
- ไม่ควรเก็บ Plain Text Password