目录
-
- [一、pgcrypto 简介](#一、pgcrypto 简介)
-
- [1.1 安装 pgcrypto 扩展](#1.1 安装 pgcrypto 扩展)
- [1.2 pgcrypto 包含的函数](#1.2 pgcrypto 包含的函数)
- [二、用法①:对称加密(使用 AES、Blowfish 算法)](#二、用法①:对称加密(使用 AES、Blowfish 算法))
-
- [2.1 密钥](#2.1 密钥)
- [2.2 密钥+偏移量](#2.2 密钥+偏移量)
- 三、用法②:PGP加解密
-
- [3.1 什么是PGP算法?](#3.1 什么是PGP算法?)
- [3.2 使用 GPG 生成密钥对](#3.2 使用 GPG 生成密钥对)
- [3.3 列举密钥对](#3.3 列举密钥对)
- [3.4 导出公钥、私钥](#3.4 导出公钥、私钥)
- [3.5 使用 pgcrypto 进行 PGP 加解密](#3.5 使用 pgcrypto 进行 PGP 加解密)
- 四、自定义存储过程
-
- [4.1 AES 加密的存储过程](#4.1 AES 加密的存储过程)
- [4.2 AES 解密的存储过程](#4.2 AES 解密的存储过程)
- 五、补充
-
- [5.1 报错:Postgresql Error: Corrupt ascii-armor](#5.1 报错:Postgresql Error: Corrupt ascii-armor)
- [5.2 在线生成 PGP 密钥对网址推荐](#5.2 在线生成 PGP 密钥对网址推荐)
背景:
- 在我们的日常开发中,对安全级别要求较高的项目,对敏感数据都要求加密保存。
- 在 PostgreSQL 中,可以使用
pgcrypto
扩展来实现 AES 和 RSA 加密,下面我们来介绍一下详细的步骤和方法。
- pgcrypto官方文档: https://www.postgresql.org/docs/13/pgcrypto.html
- pgcrypto中文文档: http://www.postgres.cn/docs/13/pgcrypto.html
一、pgcrypto 简介
1.1 安装 pgcrypto 扩展
首先,需要确保 pgcrypto
扩展已安装。可以使用以下命令在数据库中安装:
sql
CREATE EXTENSION pgcrypto;
1.2 pgcrypto 包含的函数
sql
function armor(data bytea) returns text
function armor(data bytea, keys text[], values text[]) returns text
function crc32
function crypt(password text, salt text) returns text
function date_format
function dearmor(data text) returns bytea
function decrypt(data bytea, key bytea, type text) returns bytea
function decrypt_iv(data bytea, key bytea, iv bytea, type text) returns bytea
function digest(data text, type text) returns bytea
function digest(data bytea, type text) returns bytea
function encrypt(data bytea, key bytea, type text) returns bytea
function encrypt_iv(data bytea, key bytea, iv bytea, type text) returns bytea
function gen_random_bytes(count integer) returns bytea
function gen_random_uuid() returns uuid
function gen_salt(type text) returns text
function gen_salt(type text, iter_count integer) returns text
function generate_19bit_timestamp_key
function hmac(data text, key text, type text) returns bytea
function hmac(data bytea, key bytea, type text) returns bytea
function if
function ifnull
function int2interval
function pgp_armor_headers(data text, key out text, value out text) returns setof record
function pgp_key_id(bytea) returns text
function pgp_pub_decrypt(msg bytea, key bytea) returns text
function pgp_pub_decrypt(msg bytea, key bytea, psw text) returns text
function pgp_pub_decrypt(msg bytea, key bytea, psw text, options text) returns text
function pgp_pub_decrypt_bytea(msg bytea, key bytea) returns bytea
function pgp_pub_decrypt_bytea(msg bytea, key bytea, psw text) returns bytea
function pgp_pub_decrypt_bytea(msg bytea, key bytea, psw text, options text) returns bytea
function pgp_pub_encrypt(data text, key bytea) returns bytea
function pgp_pub_encrypt(data text, key bytea, options text) returns bytea
function pgp_pub_encrypt_bytea(data bytea, key bytea) returns bytea
function pgp_pub_encrypt_bytea(data bytea, key bytea, options text) returns bytea
function pgp_sym_decrypt(msg bytea, psw text) returns text
function pgp_sym_decrypt(msg bytea, psw text, options text) returns text
function pgp_sym_decrypt_bytea(msg bytea, psw text) returns bytea
function pgp_sym_decrypt_bytea(msg bytea, psw text, options text) returns bytea
function pgp_sym_encrypt(data text, psw text) returns bytea
function pgp_sym_encrypt(data text, psw text, options text) returns bytea
function pgp_sym_encrypt_bytea(data bytea, psw text) returns bytea
function pgp_sym_encrypt_bytea(data bytea, psw text, options text) returns bytea
function str_to_date
function update_triggers_t_open_contract_event
二、用法①:对称加密(使用 AES、Blowfish 算法)
2.1 密钥
- 使用
pgcrypto
扩展进行对称加密(AES)的示例SQL如下:
sql
-- 加密(密钥)
SELECT encrypt('Hello World', 'y_secret_key', 'aes');
-- 解密(密钥)
SELECT decrypt(encrypt('Hello World', 'y_secret_key', 'aes'), 'y_secret_key', 'aes');
-- 补充:16进制转换
SELECT decode(encode('Hello World', 'hex'), 'hex');
-- 补充:Base64转换
SELECT decode(encode('Hello World', 'base64'), 'base64');
执行结果:
-
y_secret_key
:定制密钥,用于加解密。 -
encrypt(加密内容, 密钥, 加密算法)
:加密函数,返回密文内容。 -
decrypt(加密内容, 密钥, 加密算法)
:解密函数,返回明文内容。 -
aes
:加密算法,语法为algorithm[-mode][/pad:padding]
,其中变量可选值如下:algorithm:
- bf -- Blowfish
- aes -- AES (Rijndael-128, -192 或 -256)
mode:
- cbc -- 下一个块依赖前一个(默认)
- ecb -- 每一个块被独立加密(只用于测试)
padding:
- pkcs -- 数据可以是任意长度(默认)
- none -- 数据必须是密码块尺寸的倍数
因此,例如下面这两个用例是等效的:
sql
encrypt(data, 'fooz', 'aes')
encrypt(data, 'fooz', 'aes-cbc/pad:pkcs')
2.2 密钥+偏移量
AES 加解密一般使用的是 密钥
+ 偏移量
的方式来进行加解密的,使用 pgcrypto
扩展的实现方式如下:
sql
-- 加密(密钥+偏移量)
SELECT encrypt_iv('Hello World', 'y_secret_key', 'y_secret_iv', 'aes');
-- 加密 + 字节转16进制:8cf41e62e0319d19cb6cc515ca453ba8
SELECT encode(encrypt_iv('Hello World', 'y_secret_key', 'y_secret_iv', 'aes'), 'hex');
-- 加密 + 字节转16进制 + 转大写:8CF41E62E0319D19CB6CC515CA453BA8
SELECT upper(encode(encrypt_iv('Hello World', 'y_secret_key', 'y_secret_iv', 'aes'), 'hex'));
-- 解密(密钥+偏移量)
SELECT decrypt_iv(encrypt_iv('Hello World', 'y_secret_key', 'y_secret_iv', 'aes'), 'y_secret_key', 'y_secret_iv', 'aes');
-- 16进制转字节(不区分大小写) + 解密
SELECT decrypt_iv(decode('8CF41E62E0319D19CB6CC515CA453BA8', 'hex'), 'y_secret_key', 'y_secret_iv', 'aes');
执行结果:
三、用法②:PGP加解密
3.1 什么是PGP算法?
PGP(Pretty Good Privacy)
是一种 用于数据加密和解密 的技术,于 1991 年开发。
- PGP 使用 混合加密技术,结合了对称加密和非对称加密的优点,提供了一种高效且安全的数据加密解决方案。
3.2 使用 GPG 生成密钥对
GPG(GNU Privacy Guard)
是 GNU 项目的一部分,他是 PGP
的一个开源实现。
- 大部分 Linux 系统(包括 Git Bash)中都默认集成了 GPG 工具。
注意: 大家不要搞混了,GPG 是用于实现 PGP 的一个开源工具。
我们可以使用 GPG 工具生成密钥对,命令如下所示:
shell
# 生成密钥对(注意:Real name 要求不能是数字开头,长度不能小于5位!)
gpg --gen-key
执行结果:
从下图可以看到,执行命令之后需要输入很多信息用于生成密钥对。
3.3 列举密钥对
使用 GPG 工具列举密钥对的命令如下:
shell
# 列举密钥对(这里的 KEYID 就是前面的 Real name)
gpg -a --export KEYID > public.key
执行结果:
可以看到,成功列举出来我们刚才生成的密钥对。
3.4 导出公钥、私钥
以 ASCII-armored
格式导出一个公钥,命令如下:
shell
# 导出公钥(这里的 KEYID 就是前面的 Real name)
gpg -a --export KEYID > public.key
# 查看公钥
cat public.key
以 ASCII-armored
格式导出一个私钥,命令如下:
shell
# 导出私钥(这里的 KEYID 就是前面的 Real name)
gpg -a --export-secret-keys KEYID > secret.key
# 查看私钥
cat secret.key
注意: 在把这些密钥交给 PGP 函数之前,你需要对它们使用
dearmor()
。或者如果你能处理二进制数据,你可以从命令中去掉-a
。
3.5 使用 pgcrypto 进行 PGP 加解密
在 PGSQL 中,我们可以使用 pgcrypto 扩展来实现 PGP 加密,命令如下:
sql
# 加密(公钥加密)
select pgp_pub_encrypt('Hello', dearmor('公钥'));
# 加密 + 字节转16进制
select encode(pgp_pub_encrypt('Hello', dearmor('公钥')), 'hex');
# 解密(私钥解密)
select pgp_pub_decrypt('密文'), dearmor('私钥'));
# 16进制转字节 + 解密
select pgp_pub_decrypt(decode('密文', 'hex'), dearmor('私钥'));
dearmor()
:与之配对的是armor()
函数。armor() 和 dearmor() 函数把二进制数据 包装 / 解包 成 PGPASCII-armor
格式。这种格式基本上是带有 CRC 和额外格式化的 Base64。
补充:代码中的
密文
、公钥
和私钥
需要调整为具体的值,由于密钥篇幅较长,单独在下面提供了密钥对Demo。
公钥Demo:
shell
-----BEGIN PGP PUBLIC KEY BLOCK-----
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
yzbUTOI=
=uyyu
-----END PGP PUBLIC KEY BLOCK-----
私钥Demo:
shell
-----BEGIN PGP PRIVATE KEY BLOCK-----
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
cqYOku+CLFEmFo7kQKeFX3/gOwd+Yss21Ezi
=uW6i
-----END PGP PRIVATE KEY BLOCK-----
四、自定义存储过程
这里我们以 AES
加密方式举例。
4.1 AES 加密的存储过程
SQL如下:
sql
CREATE OR REPLACE FUNCTION aes_encrypt(intext character varying)
RETURNS text
LANGUAGE plpgsql
AS $function$
BEGIN
RETURN upper(encode(encrypt_iv(intext::bytea, 'key_111', 'iv_222', 'aes'), 'hex'))::text;
END;
$function$
;
执行结果:
4.2 AES 解密的存储过程
SQL如下:
sql
CREATE OR REPLACE FUNCTION aes_decrypt(intext text)
RETURNS text
LANGUAGE plpgsql
AS $function$
BEGIN
RETURN encode(decrypt_iv(decode(intext, 'hex'), 'key_111', 'iv_222', 'aes'), 'escape');
END;
$function$
;
escape
编码格式主要用于将二进制数据转换为可以在文本环境中安全传输和存储的形式。例如,在 SQL 查询中嵌入二进制数据时,使用escape
编码可以避免特殊字符引起的问题。
执行结果:
五、补充
5.1 报错:Postgresql Error: Corrupt ascii-armor
如果出现报错 Postgresql Error: Corrupt ascii-armor
,则说明密钥格式错误,建议采用标准的 PGP
密钥对。
5.2 在线生成 PGP 密钥对网址推荐
整理完毕,完结撒花~ 🌻
参考地址:
1.PostgreSQL 如何有效地处理数据的加密和解密,https://blog.csdn.net/sdasdas12/article/details/140268016
2.GnuPG用法,https://blog.csdn.net/weixin_45895555/article/details/109906607