postgresql 数据库列加密postgres

okxuctiv  于 2022-12-03  发布在  PostgreSQL
关注(0)|答案(3)|浏览(394)

如何使用pgcrypto插件加密postgres数据库中的列?
我正在使用postgres 9.3,我需要加密我的一个列,postgres也支持AES加密或通过任何方式我可以实现它?

lnlaulya

lnlaulya1#

是的,Postgres**pgcrypto模块确实支持AES。所有详细信息和示例都可以在here**中找到。关于示例用法:

-- 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)
r3i60tvu

r3i60tvu2#

  • 以上不是加密,因为加密是可逆的,这意味着如果您加密一些秘密文本或值,您应该能够知道该秘密值或文本是什么,而不像散列,您希望验证用户提供的值是否与散列值匹配。*

这就是使用pgcrypto模块加密列数据的方式。
第一个
是您的加密密钥。您可以从此处生成加密密钥encryption key generator并选择您要选择的位。建议选择最小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/

**注意:**您可以对数据行使用bytea资料类型,而不是保留varchar中的name数据行。因此,数据表会变成

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
tct7dpnv

tct7dpnv3#

编辑队列已满,
在这里写一些关于地穴描述:

一. 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()生成新的salt值。要检查密码,请将存储的散列值作为盐传递,并测试结果是否与存储的值匹配。
"男人3号墓穴"
https://manpages.ubuntu.com/manpages/jammy/en/man3/crypt.3.html
crypt、crypt_r、crypt_rn和crypt_ra函数不可逆地“散列”短语,以便使用加密“散列方法”存储在系统密码数据库(shadow(5))中。

二. pgp_sym_encrypt

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消息。

相关问题