如何在 PostgreSQL 中使用 aes-256-gcm 加密来加密列?

use*_*921 5 postgresql encryption

作为数据库点人员,我需要对表中任何位置的 SSN 号码进行加密。我们使用 PostgreSQL。我的应用程序同行要求我们使用 AES-256-GCM 加密算法。但是,我不太确定如何在 postgresql 中应用它。

经过谷歌搜索后,我可以使用这两种 AES 方法之一进行加密:

1.

UPDATE ssnTable
   SET encrypted_ssn = encrypt(encrypted_ssn::bytea, 'mykey', 'aes')`
Run Code Online (Sandbox Code Playgroud)

2.

UPDATE ssnTable
   SET encrypted_ssn = pgp_sym_encrypt(encrypted_ssn, 'mykey', 'compress-algo=1, cipher-algo=aes256')
Run Code Online (Sandbox Code Playgroud)

以上都没有专门使用“aes-256-gcm”算法,这正是我被要求使用的算法。关于如何在 PostgreSQL 的列上使用这个算法有什么想法吗?

war*_*yen 0

-- Create a custom function for AES-GCM encryption using OpenSSL
CREATE OR REPLACE FUNCTION aes256_gcm_encrypt(data bytea, key text, nonce text)
RETURNS bytea AS $$
DECLARE
  result bytea;
BEGIN
  EXECUTE 'SELECT pg_temp.encrypt($1, ''aes-256-gcm'', ' || quote_literal(key) || '::bytea, ' || quote_literal(nonce) || '::bytea)'
  INTO result
  USING data;
  RETURN result;
END;
$$ LANGUAGE plpgsql;

-- Usage: Encrypt a column using AES-256-GCM
UPDATE ssnTable
SET encrypted_ssn = aes256_gcm_encrypt(encrypted_ssn, 'encryption_key', 'nonce');

-- If needed, you can also create a decryption function
-- But remember to handle exceptions and security aspects properly.
Run Code Online (Sandbox Code Playgroud)