Để mã hóa dữ liệu trong PostgreSQL, bạn có thể thực hiện qua nhiều cấp độ, bao gồm mã hóa dữ liệu khi lưu trữ (data-at-rest) hoặc khi truyền qua mạng (data-in-transit). PostgreSQL không hỗ trợ mã hóa cột (column-level encryption) một cách trực tiếp, nhưng bạn có thể sử dụng các hàm mã hóa/giải mã hoặc các phương thức từ các thư viện khác.

Dưới đây là các phương pháp cụ thể để mã hóa dữ liệu:

1. Mã hóa dữ liệu khi truyền qua mạng (SSL Encryption)

PostgreSQL hỗ trợ mã hóa qua SSL (Secure Sockets Layer) để bảo mật dữ liệu khi truyền giữa client và server.

# Tạo cặp khóa và chứng chỉ bằng OpenSSL
openssl req -new -x509 -days 365 -nodes -out server.crt -keyout server.key
chmod og-rwx server.key

Di chuyển các tệp server.crtserver.key vào thư mục cấu hình PostgreSQL (thường là /var/lib/postgresql/data/ trên Linux).

Sửa đổi tệp postgresql.conf để bật SSL:

ssl = on
ssl_cert_file = 'server.crt'
ssl_key_file = 'server.key'

Khởi động lại PostgreSQL để kích hoạt SSL.

2. Mã hóa dữ liệu trong các cột (Column-level Encryption)

Mặc dù PostgreSQL không hỗ trợ mã hóa cột trực tiếp, bạn có thể sử dụng các hàm mã hóa tích hợp sẵn hoặc các hàm từ thư viện bên ngoài như pgcrypto.

a. Sử dụng pgcrypto

Cài đặt extension pgcrypto:

CREATE EXTENSION pgcrypto;

Sử dụng hàm pgp_sym_encrypt để mã hóa dữ liệu:

-- Mã hóa dữ liệu
INSERT INTO users (username, email)
VALUES ('user1', pgp_sym_encrypt('[email protected]', 'my_secret_key'));

Giải mã dữ liệu sử dụng hàm pgp_sym_decrypt:

-- Giải mã dữ liệu
SELECT username, pgp_sym_decrypt(email::bytea, 'my_secret_key') AS email
FROM users;

3. Mã hóa toàn bộ cơ sở dữ liệu (TDE – Transparent Data Encryption)

PostgreSQL không cung cấp mã hóa toàn bộ cơ sở dữ liệu như một tính năng tích hợp sẵn. Tuy nhiên, bạn có thể sử dụng mã hóa ổ đĩa thông qua hệ điều hành hoặc sử dụng giải pháp Transparent Data Encryption (TDE) từ các hệ thống lưu trữ hoặc từ cloud provider như AWS RDS, Google Cloud SQL.

Ví dụ, nếu bạn đang chạy PostgreSQL trên Linux, có thể sử dụng LUKS để mã hóa phân vùng nơi lưu trữ cơ sở dữ liệu.

# Tạo phân vùng được mã hóa
cryptsetup luksFormat /dev/sdX
cryptsetup luksOpen /dev/sdX encrypted_pgsql
mkfs.ext4 /dev/mapper/encrypted_pgsql

4. Mã hóa cấp ứng dụng (Application-level Encryption)

Một cách tiếp cận khác là mã hóa dữ liệu từ phía ứng dụng trước khi lưu vào PostgreSQL. Trong trường hợp này, bạn sử dụng các thư viện mã hóa của ngôn ngữ lập trình ứng dụng (như Python, Java, Node.js) để mã hóa dữ liệu trước khi lưu và giải mã khi đọc dữ liệu.

b. Ví dụ với Python và thư viện Fernet

from cryptography.fernet import Fernet

# Khởi tạo khóa mã hóa
key = Fernet.generate_key()
cipher_suite = Fernet(key)

# Mã hóa dữ liệu
cipher_text = cipher_suite.encrypt(b"my_secret_data")

# Giải mã dữ liệu
plain_text = cipher_suite.decrypt(cipher_text)
print(plain_text.decode())

Các phương pháp mã hóa này giúp đảm bảo dữ liệu được bảo mật khi lưu trữ và truyền tải, tùy thuộc vào yêu cầu bảo mật của hệ thống mà bạn có thể chọn phương pháp phù hợp.