PostgreSQL(十三)pgcrypto 扩展实现 AES、PGP 加密,并自定义存储过程

news2024/10/27 22:32:44

目录

    • 一、pgcrypto 简介
      • 1.1 安装 pgcrypto 扩展
      • 1.2 pgcrypto 包含的函数
    • 二、用法①:对称加密(使用 AES、Blowfish 算法)
      • 2.1 密钥
      • 2.2 密钥+偏移量
    • 三、用法②:PGP加解密
      • 3.1 什么是PGP算法?
      • 3.2 使用 GPG 生成密钥对
      • 3.3 列举密钥对
      • 3.4 导出公钥、私钥
      • 3.5 使用 pgcrypto 进行 PGP 加解密
    • 四、自定义存储过程
      • 4.1 AES 加密的存储过程
      • 4.2 AES 解密的存储过程
    • 五、补充
      • 5.1 报错:Postgresql Error: Corrupt ascii-armor
      • 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 扩展已安装。可以使用以下命令在数据库中安装:

CREATE EXTENSION pgcrypto;

1.2 pgcrypto 包含的函数

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如下:
-- 加密(密钥)
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 – 数据必须是密码块尺寸的倍数

因此,例如下面这两个用例是等效的:

encrypt(data, 'fooz', 'aes')
encrypt(data, 'fooz', 'aes-cbc/pad:pkcs')

2.2 密钥+偏移量

AES 加解密一般使用的是 密钥 + 偏移量 的方式来进行加解密的,使用 pgcrypto 扩展的实现方式如下:

-- 加密(密钥+偏移量)
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 工具生成密钥对,命令如下所示:

# 生成密钥对(注意:Real name 要求不能是数字开头,长度不能小于5位!)
gpg --gen-key

执行结果:

从下图可以看到,执行命令之后需要输入很多信息用于生成密钥对。

3.3 列举密钥对

使用 GPG 工具列举密钥对的命令如下:

# 列举密钥对(这里的 KEYID 就是前面的 Real name)
gpg -a --export KEYID > public.key

执行结果:

可以看到,成功列举出来我们刚才生成的密钥对。

3.4 导出公钥、私钥

ASCII-armored 格式导出一个公钥,命令如下:

# 导出公钥(这里的 KEYID 就是前面的 Real name)
gpg -a --export KEYID > public.key
# 查看公钥
cat public.key

ASCII-armored 格式导出一个私钥,命令如下:

# 导出私钥(这里的 KEYID 就是前面的 Real name)
gpg -a --export-secret-keys KEYID > secret.key
# 查看私钥
cat secret.key

注意: 在把这些密钥交给 PGP 函数之前,你需要对它们使用 dearmor()。或者如果你能处理二进制数据,你可以从命令中去掉 -a

3.5 使用 pgcrypto 进行 PGP 加解密

在 PGSQL 中,我们可以使用 pgcrypto 扩展来实现 PGP 加密,命令如下:

# 加密(公钥加密)
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() 函数把二进制数据 包装 / 解包 成 PGP ASCII-armor 格式。这种格式基本上是带有 CRC 和额外格式化的 Base64。

补充:代码中的 密文公钥私钥 需要调整为具体的值,由于密钥篇幅较长,单独在下面提供了密钥对Demo。

公钥Demo:

-----BEGIN PGP PUBLIC KEY BLOCK-----

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
yzbUTOI=
=uyyu
-----END PGP PUBLIC KEY BLOCK-----

私钥Demo:

-----BEGIN PGP PRIVATE KEY BLOCK-----

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
cqYOku+CLFEmFo7kQKeFX3/gOwd+Yss21Ezi
=uW6i
-----END PGP PRIVATE KEY BLOCK-----

四、自定义存储过程

这里我们以 AES 加密方式举例。

4.1 AES 加密的存储过程

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如下:

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 密钥对网址推荐

  • 网址: https://www.jashtool.com/generate/pgp-key

整理完毕,完结撒花~ 🌻





参考地址:
1.PostgreSQL 如何有效地处理数据的加密和解密,https://blog.csdn.net/sdasdas12/article/details/140268016
2.GnuPG用法,https://blog.csdn.net/weixin_45895555/article/details/109906607

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2224977.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【AI大模型】深入解析 存储和展示地理数据(.kmz)文件格式:结构、应用与项目实战

文章目录 1. 引言2. 什么是 .kmz 文件?2.1 .kmz 文件的定义与用途2.2 .kmz 与 .kml 的关系2.3 常见的 .kmz 文件使用场景 3. .kmz 文件的内部结构3.1 .kmz 文件的压缩格式3.2 解压缩 .kmz 文件的方法3.3 .kmz 文件的典型内容3.4 .kml 文件的结构与主要元素介绍 4. 深…

豆包MarsCode Agent 登顶 SWE-bench Lite 评测集

大语言模型(LLM)能力正在迅速提升,对包括软件工程在内的诸多行业产生了深远影响。GPT-4o、Claude3.5 等 LLM 已经逐步展现出胜任复杂任务的能力,例如文本总结、智能客服、代码生成,甚至能够分析和解决数学问题。在这一…

为什么在网络中不能直接传输数据

为什么在网络中不能直接传输数据 原因 在网络中不能直接传输原始数据形式,主要有以下几方面原因: 数据表示的多样性:不同的计算机系统、编程语言和应用程序对数据的表示方式可能各不相同。例如,整数在不同的编程语言中可能有不同…

了解Java开发中的会话层

在现代Web应用开发中,会话管理是一个至关重要的概念。它涉及到如何在客户端和服务器之间保持用户状态信息,从而提供个性化、连续的用户体验。Java作为一种广泛使用的编程语言,在Web开发中扮演着重要角色,特别是在企业级应用中。了…

基于neo4j的课程资源生成性知识图谱

你是不是还在为毕业设计苦恼?又或者想在课堂中进行知识的高效管理?今天给大家分享一个你一定会感兴趣的技术项目——基于Neo4j的课程资源生成性知识图谱!💡 这套系统通过知识图谱的形式,将课程资源、知识点和学习路径…

一文掌握异步web框架FastAPI(五)-- 中间件(测试环境、访问速率限制、请求体解析、自定义认证、重试机制、请求频率统计、路径重写)

接上篇:一文掌握异步web框架FastAPI(四)-CSDN博客 目录 七、中间件 15、测试环境中间件 16、访问速率限制中间件,即限制每个IP特定时间内的请求数(基于内存,生产上要使用数据库) 1)限制单ip访问速率 2)增加限制单ip并发(跟上面的一样,也是限制每个IP特定时间内的请…

vue2结合echarts实现数据排名列表——前端柱状进度条排行榜

写在前面,博主是个在北京打拼的码农,工作多年做过各类项目,最近心血来潮在这儿写点东西,欢迎大家多多指教。 数据排名列表——图表开发,动态柱状图表,排名图 UI 直接搜到类似在线代码(数据列表…

事务的原理、MVCC的原理

事务特性 数据库事务具有以下四个基本特性,通常被称为 ACID 特性: 原子性(Atomicity):事务被视为不可分割的最小工作单元,要么全部执行成功,要么全部失败回滚。这意味着如果事务执行过程中发生…

交换机:端口安全与访问控制指南

为了实现端口安全和访问控制,交换机通常通过以下几种机制和配置来保护网络,防止未经授权的访问和恶意攻击。 01-端口安全 定义及功能 端口安全功能允许管理员限制每个交换机端口可以学习的MAC地址数量。 通过绑定特定的MAC地址到交换机的某一端口上&a…

二十二、Python基础语法(模块)

模块(module):在python中,每个代码文件就是一个模块,在模块中定义的变量、函数、类别人都可以直接使用,如果想要使用别人写好的模块,就必须先导入别人的模块,模块名须满足标识符规则(由字母、数…

MFC七段码显示实例

在MFC中添加iSenvenSegmentAnalogX控件,添加编辑框和按钮实现在编辑框中输入数字点击按钮后数字用七段码显示 1、在对话框中点击右键如下图添加控件和变量 2、在sevenDlg.h中添加代码 public: void ShowInd(int,double);3、在sevenDlg.cpp中添加代码 void CSe…

将 el-date-picker获取的时间数据转换成时间戳

在Vue.js中使用Element UI的el-date-picker组件时,你可以获取用户选择的日期并将其转换为时间戳。el-date-picker通常返回的是一个Date对象或一个格式化后的字符串(取决于你如何配置它)。下面是一个示例,展示了如何将el-date-pick…

攻防世界的新手web题解

攻防世界引导模式 1、disabled_button 好&#xff0c;给了一个按钮&#xff0c;第一道题目就不会做 看的wp<input disabled class"btn btn-default" style"height:50px;width:200px;" type"submit" value"flag" name"auth&q…

来源爬虫程序调研报告

来源爬虫程序调研报告 一、什么是爬虫 爬虫&#xff1a;就是抓取网页数据的程序。从网站某一个页面&#xff08;通常是首页&#xff09;开始&#xff0c;读取网页的内容&#xff0c;找到在网页中的其它链接地址&#xff0c;然后通过这些链接地址寻找下一个网页&#xff0c;这…

植物健康,Spring Boot来保障

5系统详细实现 5.1 系统首页 植物健康系统需要登录才可以看到首页。具体界面的展示如图5.1所示。 图5.1 系统首页界面 5.2 咨询专家 可以在咨询专家栏目发布消息。具体界面如图5.2所示。 图5.2 咨询专家界面 5.3 普通植物检查登记 普通员工可以对普通植物检查登记信息进行添…

07 设计模式-结构型模式-桥接模式

桥接&#xff08;Bridge&#xff09;是用于把抽象化与实现化解耦&#xff0c;使得二者可以独立变化。这种类型的设计模式属于结构型模式&#xff0c;它通过提供抽象化和实现化之间的桥接结构&#xff0c;来实现二者的解耦。 这种模式涉及到一个作为桥接的接口&#xff0c;使得…

入门 | Prometheus+Grafana 普罗米修斯

#1024程序员节&#xff5c;征文# 一、prometheus介绍 1、监控系统组成 一个完整的监控系统需要包括如下功能&#xff1a;数据产生、数据采集、数据存储、数据处理、数据展示、分析、告警等。 &#xff08;1&#xff09;、数据来源 数据来源&#xff0c;也就是需要监控的数据…

VS Code 自动生成代码

1. 在vs code中的左下角&#xff0c;点击设置中的snippets。 2. 输入你需要生成的代码种类&#xff0c;这边以JS为例 打开后可以看到下面这样 从Example看起&#xff0c; 1.Print to console 这个是提升信息&#xff0c;就是当你输入代码的时候的提升。 2.prefix是缩写。 3.b…

python爬虫——Selenium的基本使用

目录 一、Selenium的介绍 二、环境准备 1.安装Selenium 2.安装WebDriver 三、元素定位 1.常用定位元素的方法 2. 通过指定方式定位元素 四、窗口操作 1.最大化浏览器窗口 2.设置浏览器窗口大小 3.切换窗口或标签页 切换回主窗口 4. 关闭窗口 关闭当前窗口 关闭所…

由于找不到mfc140u.dll,无法继续执行代码怎么办,总有6个解决方法

在软件开发和程序运行过程中&#xff0c;许多用户可能会遇到“找不到mfc140u.dll&#xff0c;无法继续执行代码”的问题。本文将对该问题进行详细解读&#xff0c;分析其产生原因&#xff0c;并提供相应的解决方案。 一、mfc140u.dll是什么 mfc140u.dll是Microsoft Visual C 2…