ฟังก์ชันเข้ารหัส/ถอดรหัส AES
AES_ENCRYPT(str, key_str)→ คืนค่า BLOB (binary)AES_DECRYPT(crypt_str, key_str)→ คืนค่า BLOB ต้อง CAST เป็น CHAR
ไวยากรณ์
-- เข้ารหัสตอน INSERT
INSERT INTO yourTable VALUES (AES_ENCRYPT('yourValue', 'secretKey'));
-- ถอดรหัสตอน SELECT
SELECT CAST(AES_DECRYPT(yourColumn, 'secretKey') AS CHAR) FROM yourTable;
ตัวอย่าง: ตาราง demo63
CREATE TABLE demo63 (value BLOB);
INSERT INTO demo63 VALUES (AES_ENCRYPT('John', 'PASS'));
INSERT INTO demo63 VALUES (AES_ENCRYPT('David', 'PASS'));
INSERT INTO demo63 VALUES (AES_ENCRYPT('123456', 'PASS'));
ข้อมูลที่จัดเก็บ (BLOB - แสดงเป็น Hex)
+------------------------------------+ | value | +------------------------------------+ | 0x16D8A4F11321D761920783BF96BB8314 | | 0x0A85099F705F21D27B0129C54C4473AA | | 0xAB7C6D6068BC100B0F04D1C4EA068AC9 | +------------------------------------+
คำสั่งถอดรหัส
SELECT CAST(AES_DECRYPT(value, 'PASS') AS CHAR) FROM demo63;
ผลลัพธ์
+------------------------------------------+ | CAST(AES_DECRYPT(value, 'PASS') AS CHAR) | +------------------------------------------+ | John | | David | | 123456 | +------------------------------------------+
รายละเอียดสำคัญ
| หัวข้อ | รายละเอียด |
|---|---|
| Key Length | 128-bit (16 bytes) โดยค่าเริ่มต้น — key ยาวกว่าจะถูก hash |
| Block Size | 16 bytes (AES block) |
| Mode | ECB (Electronic Codebook) — คงที่ ไม่มี IV |
| Charset | Key และ String ใช้ charset ของ connection |
| Return Type | BLOB (binary) — ต้อง CAST/CONVERT |
ข้อควรระวังด้านความปลอดภัย
- ECB Mode ไม่ปลอดภัย สำหรับข้อมูลที่มี pattern ซ้ำ — ใช้ได้แค่ข้อมูลสั้น/ไม่ซ้ำ
- Key Management: อย่า hardcode key ในโค้ด — ใช้ Environment Variable หรือ Key Vault
- Logging: คำสั่ง SQL ที่มี AES_ENCRYPT อาจถูก log ไว้ใน General/Slow Log
- Backup: สำรอง Key แยกจากข้อมูล
ทางเลือกที่ปลอดภัยกว่า: Application-Level Encryption
เข้ารหัสใน Application (Java, Python, Go) ด้วย AES-GCM หรือ ChaCha20-Poly1305 แล้วเก็บ ciphertext + nonce + tag ใน DB
MySQL 8.0: ฟังก์ชันเพิ่มเติม
AES_ENCRYPT(str, key, init_vector)— รองรับ CBC mode ด้วย IVAES_DECRYPT(crypt, key, init_vector)CREATE ENCRYPTION/ALTER TABLE ... ENCRYPTION— Tablespace Encryption (TDE)