Mở Rộng Bảo Mật Cơ Sở Dữ Liệu Với pgcrypto Trong PostgreSQL

1. Giới Thiệu

pgcrypto là tiện ích mở rộng tích hợp sẵn trong PostgreSQL, cung cấp các chức năng mã hóa và băm mật khẩu. Module này cho phép thực hiện các thao tác bảo mật dữ liệu trực tiếp trên cơ sở dữ liệu, bao gồm mã hóa đối xứng, mã hóa bất đối xứng, tạo băm mật khẩu, và xác thực chữ ký số. Với việc hỗ trợ nhiều thuật toán tiêu chuẩn như AES, RSA, SHA-2, pgcrypto giúp bảo vệ thông tin nhạy cảm như số định danh cá nhân, số thẻ tín dụng mà không cần xử lý ở tầng ứng dụng.

1.1 Đặc điểm chính

  • Phù hợp với PostgreSQL 13 trở lên, được đánh giá là module "tin cậy" (trusted extension)
  • Tích hợp trực tiếp với cơ sở dữ liệu, giảm độ trễ xử lý so với mã hóa ở ứng dụng
  • Chấp nhận các thuật toán mã hóa phổ biến: md5, sha1, sha256, sha512, và các thuật toán từ OpenSSL

2. Cài Đặt

Để kích hoạt pgcrypto, thực hiện lệnh sau trong PostgreSQL:

CREATE EXTENSION pgcrypto;

Module này được cài đặt sẵn trong các gói cài đặt PostgreSQL. Với bản source, cần biên dịch từ thư mục contrib/pgcrypto trước khi tạo extension.

3. Hàm Mã Hóa Cơ Bản

3.1 Hàm Băm Thông Thường

Dùng để tính toán giá trị băm (hash) của dữ liệu, đảm bảo tính toàn vẹn và duy nhất:

SELECT digest('Sample Text', 'sha256');
-- Kết quả: \x6b159c2b3d9b0f602d1d6c23c3c9d1c5d4f0d3e2a1b0c9d8e7f6a5b4c3d2e1f0

3.2 Hàm Băm Mật Khẩu

Chức năng chính để lưu trữ mật khẩu an toàn:

SELECT crypt('user_password', gen_salt('bf'));
-- Kết quả: $2a$06$ZjY7hG3vNkL8mR9pQwXyZeJ6f8gH7iK9l0mNpQrStUvWxYz1a2b3c4d5e6f7g8h9i0j

gen_salt tạo khóa ngẫu nhiên, crypt sử dụng khóa này để tạo băm mật khẩu, đảm bảo mỗi mật khẩu có giá trị băm khác nhau.

3.3 Mã Hóa PGP

Mã hóa đối xứng

SELECT pgp_sym_encrypt('Confidential Data', 'encryption_passphrase');
-- Giải mã: pgp_sym_decrypt(mã_hóa, 'encryption_passphrase')

Mã hóa bất đối xứng

Sử dụng khóa công khai để mã hóa, khóa riêng để giải mã:

SELECT pgp_pub_encrypt('Secret Message', dearmor(public_key));
-- Giải mã: pgp_pub_decrypt(mã_hóa, dearmor(private_key))

3.4 Hàm Tạo Dữ Liệu Ngẫu Nhiên

Được dùng để tạo khóa, IV hoặc UUID an toàn:

SELECT gen_random_bytes(16);  -- 16 byte
SELECT gen_random_uuid();     -- UUID ngẫu nhiên

4. Lưu Ý Khi Sử Dụng

  • Đối với dữ liệu lớn, mã hóa sẽ ảnh hưởng đến hiệu năng hệ thống
  • Ưu tiên sử dụng thuật toán mạnh như sha256, AES-256 thay vì md5
  • Luôn sử dụng gen_salt để tạo khóa cho hàm băm mật khẩu

5. Gỡ Bỏ

Thực hiện lệnh sau để xóa module:

DROP EXTENSION pgcrypto;

Lưu ý: Thao tác này sẽ xóa tất cả đối tượng được tạo bởi pgcrypto.

Thẻ: PostgreSQL pgcrypto aes SHA-2 OpenPGP

Đăng vào ngày 9 tháng 7 lúc 23:32