数据库列加密postgres

问题描述 投票:0回答:3

如何使用 pgcrypto 插件加密 postgres 数据库中的列?

我正在使用 postgres 9.3,我需要加密我的一列,postgres 是否也支持 Aes 加密或以任何方式我可以实现它?

database postgresql encryption aes pgcrypto
3个回答
16
投票

接受的答案不是加密,因为加密是可逆的,这意味着如果您加密某些秘密文本或值,您应该能够知道该秘密值或文本是什么,这与您想要验证用户提供的值是否匹配的散列不同是否是哈希值。

这就是使用

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/

注: 您可以使用列的

varchar
数据类型,而不是将名称列保留在
bytea
中。所以桌子就变成了

CREATE TABLE agents (
id serial primary key,
name bytea not null
);

所以,查询的时候不需要每次都强制转换,就可以这样做

SELECT pgp_sym_decrypt(name, 'longsecretencryptionkey') FROM users WHERE pgp_sym_decrypt(name::bytea, 'longsecretencryptionkey') ILIKE 'johny%'; -- querying for agents whose name start with johny

11
投票

是的,Postgres

pgcrypto
模块确实支持
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)

1
投票

编辑队列已满,
只是在这里写一些关于 crypt 的描述:

一。地穴()

密码哈希函数
https://www.postgresql.org/docs/current/pgcrypto.html#id-1.11.7.35.7

函数

crypt()
gen_salt()
是专门为哈希密码而设计的。
crypt() 进行哈希处理,gen_salt() 为其准备算法参数。

crypt(password text, salt text) returns text

计算密码的

crypt(3)-style
哈希值。存储新密码时,需要使用 gen_salt() 生成新的盐值。要检查密码,请将存储的哈希值作为盐传递,并测试结果是否与存储的值匹配。

人3地穴
https://manpages.ubuntu.com/manpages/jammy/en/man3/crypt.3.html

crypt
、crypt_r、crypt_rn 和 crypt_ra 函数 不可逆 使用加密“散列方法”将“散列”短语存储在系统密码数据库 (
shadow
(5)) 中。

二. pgp_sym_加密

PGP 加密功能
https://www.postgresql.org/docs/current/pgcrypto.html#id-1.11.7.35.8

这里的函数实现了OpenPGP(RFC 4880)标准的加密部分。支持对称密钥和公钥加密。


pgp_sym_encrypt(data text, psw text [, options text ]) returns bytea

使用对称 PGP 密钥 psw 加密数据。


pgp_sym_decrypt(msg bytea, psw text [, options text ]) returns text

解密对称密钥加密的 PGP 消息。

© www.soinside.com 2019 - 2024. All rights reserved.