如何使用 pgcrypto 插件加密 postgres 数据库中的列?
我正在使用 postgres 9.3,我需要加密我的专栏之一,postgres 是否也支持 Aes 加密或者我可以实现它?
如何使用 pgcrypto 插件加密 postgres 数据库中的列?
我正在使用 postgres 9.3,我需要加密我的专栏之一,postgres 是否也支持 Aes 加密或者我可以实现它?
是的,Postgrespgcrypto
模块确实支持AES
. 可以在此处找到所有带有示例的详细信息。至于样本用法:
-- add extension
CREATE EXTENSION pgcrypto;
-- sample DDL
CREATE TABLE test_encrypt(
value TEXT
);
INSERT INTO test_encrypt VALUES ('testvalue');
-- encrypt value
WITH encrypted_data AS (
SELECT crypt('PasswordToEncrypt0',gen_salt('md5')) as hashed_value
)
UPDATE test_encrypt SET value = (SELECT hashed_value FROM encrypted_data);
验证密码:
SELECT (value = crypt('PasswordToEncrypt0', value)) AS match FROM test_encrypt;
回报:
match
-------
t
(1 row)
以上不是加密,因为加密是可逆的,这意味着如果您加密某些秘密文本或值,您应该能够知道该秘密值或文本与散列不同的是,您想验证用户提供的值是否与散列值匹配或不。
这就是您如何使用pgcrypto
模块加密列数据。
create extension if not exists pgcrypto; -- this will install the module if not installed
CREATE TABLE agents (
id serial primary key,
name varchar not null
);
INSERT INTO agents (name) values
(pgp_sym_encrypt('Johny Smith', 'longsecretencryptionkey')),
(pgp_sym_encrypt('Bob Marley', 'longsecretencryptionkey'));
longsecretencryptionkey
是您的加密密钥。您可以从此处加密密钥生成器生成加密密钥并选择您选择的位。建议选择最小 256 位。
请记住将加密密钥保存在安全的地方。如果您丢失了加密,您将无法再解密。理解这一点非常关键。
这就是您查询它们的方式
SELECT pgp_sym_decrypt(name::bytea, 'longsecretencryptionkey') FROM users WHERE pgp_sym_decrypt(name::bytea, 'longsecretencryptionkey') ILIKE 'johny%'; -- querying for agents whose name start with johny
您可以查看这篇对我有帮助的博客文章 https://blog.andreiavram.ro/encrypt-postgresql-column/