Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> MySQL

เข้ารหัสและถอดรหัสสตริงใน MySQL ด้วย AES_ENCRYPT/AES_DECRYPT

ฟังก์ชันเข้ารหัส/ถอดรหัส 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 Length128-bit (16 bytes) โดยค่าเริ่มต้น — key ยาวกว่าจะถูก hash
Block Size16 bytes (AES block)
ModeECB (Electronic Codebook) — คงที่ ไม่มี IV
CharsetKey และ String ใช้ charset ของ connection
Return TypeBLOB (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 ด้วย IV
  • AES_DECRYPT(crypt, key, init_vector)
  • CREATE ENCRYPTION / ALTER TABLE ... ENCRYPTION — Tablespace Encryption (TDE)