1️⃣ MÃ HÓA / GIẢI MÃ DỮ LIỆU ỨNG DỤNG (Application-level)

MySQL cung cấp các hàm mã hóa/giải mã ngay trong SQL, ví dụ:

AES (Advanced Encryption Standard)

  • Mã hóa:
SELECT TO_BASE64(AES_ENCRYPT('thong_tin_can_ma_hoa', 'my_secret_key'));
  • Giải mã:
SELECT AES_DECRYPT(FROM_BASE64(ma_dulieu_mahoa), 'my_secret_key');

Lưu ý:

  • AES sử dụng key (ví dụ 'my_secret_key') để mã hóa/giải mã
  • bạn nên lưu trữ key này thật an toàn (bên ngoài source code hoặc dùng key vault)
  • kết hợp thêm TO_BASE64 để lưu dạng text dễ quản lý

DES (Data Encryption Standard) (ít dùng hơn do bảo mật yếu):

  • Mã hóa:
SELECT TO_BASE64(DES_ENCRYPT('hello', 'key'));
  • Giải mã:
SELECT DES_DECRYPT(FROM_BASE64(ma_dulieu_mahoa), 'key');

2️⃣ MÃ HÓA Ở MỨC STORAGE (Data-at-rest)

Đây là mã hóa để bảo vệ file dữ liệu khi nằm trên đĩa cứng, ví dụ nếu hacker đánh cắp file .ibd hay .frm.

MySQL hỗ trợ:

InnoDB Tablespace Encryption
Redo Log, Binary Log Encryption
Keyring plugin để quản lý master key

Cách bật:

[mysqld]
innodb_encrypt_tables=ON
innodb_encrypt_log=ON
early-plugin-load=keyring_file.so
keyring_file_data=/var/lib/mysql-keyring/keyring

sau đó khi tạo bảng:

CREATE TABLE nhanvien (
  id INT,
  ten VARCHAR(50)
) ENCRYPTION='Y';

MySQL sẽ tự mã hóa ở mức tablespace (InnoDB), bạn không cần mã hóa/giải mã thủ công.


3️⃣ TÓM TẮT NHANH

Application-level → dùng hàm AES_ENCRYPT, AES_DECRYPT ngay trong SQL
Storage-level → bật InnoDB encryption + keyring