数据库列加密postgres

Nit*_*tin 11 database encryption postgresql aes pgcrypto

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

我正在使用postgres 9.3,我需要加密我的一个专栏,postgres是否也支持Aes加密或任何意思我可以实现它?

Kou*_*Das 12

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

这是使用模块加密列数据的方式pgcrypto

create extension if not exists pgcrypto; -- this will install the module if not installed 
Run Code Online (Sandbox Code Playgroud)
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'));

Run Code Online (Sandbox Code Playgroud)
longsecretencryptionkey 
Run Code Online (Sandbox Code Playgroud)

是您的加密密钥。您可以从这里的加密密钥生成器生成加密密钥并选择您选择的位。建议选择最小 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
Run Code Online (Sandbox Code Playgroud)

您可以查看这篇博客文章,它对我有帮助 https://blog.andreiavram.ro/encrypt-postgresql-column/

注意:varchar您可以使用列的数据类型, 而不是将名称列保留在 中bytea。所以表就变成了

CREATE TABLE agents (
id serial primary key,
name bytea not null
);
Run Code Online (Sandbox Code Playgroud)

所以,当查询时你不需要每次都进行强制转换,你可以这样做

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
Run Code Online (Sandbox Code Playgroud)


Dmi*_*kov 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);
Run Code Online (Sandbox Code Playgroud)

验证密码:

SELECT (value = crypt('PasswordToEncrypt0', value)) AS match FROM test_encrypt;
Run Code Online (Sandbox Code Playgroud)

返回:

 match 
-------
 t
(1 row)
Run Code Online (Sandbox Code Playgroud)

  • 这不是(列)加密。加密是可逆的,而散列则不可逆。SQL Server 中的示例 https://docs.microsoft.com/en-us/sql/relational-databases/security/encryption/always-encrypted-database-engine?view=sql-server-ver15 (13认同)
  • 这意味着我也需要对我的应用程序代码进行更改,是否可以在应用程序级别进行任何更改时实现它. (4认同)