PostgreSQL(十三)pgcrypto 扩展实现 AES、PGP 加密,并自定义存储过程
目录
- 一、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() 函数把二进制数据 包装 / 解包 成 PGPASCII-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 textLANGUAGE plpgsql
AS $function$BEGINRETURN 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 textLANGUAGE plpgsql
AS $function$BEGINRETURN 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
相关文章:
PostgreSQL(十三)pgcrypto 扩展实现 AES、PGP 加密,并自定义存储过程
目录 一、pgcrypto 简介1.1 安装 pgcrypto 扩展1.2 pgcrypto 包含的函数 二、用法①:对称加密(使用 AES、Blowfish 算法)2.1 密钥2.2 密钥偏移量 三、用法②:PGP加解密3.1 什么是PGP算法?3.2 使用 GPG 生成密钥对3.3 列…...
uniapp使用webView打开的网页有缓存如何解决(APP,微信小程序)
1、给webView的url增加时间戳 this.webviewUrl ${url}?t${new Date().getTime()}; // 添加时间戳 2、在nginx服务器上添加响应头,告诉浏览器不可以使用缓存 location / {root /opt/webs/lcdp-client/dist;index index.html index.htm;try_files $uri $uri/ /…...
HarmonyOS 模块化设计
1.HarmonyOS 模块化设计 模块化设计文档 应用程序包开发与使用文档 1.1. 概述 组件化一直是移动端比较流行的开发方式,有着编译运行快,业务逻辑分明,任务划分清晰等优点,HarmonyOs组件化的使用,有利于模块之间的解…...
解决docker拉取readeck镜像报Error response from daemon: toomanyrequests问题
readeck 是一个内容中心,目前已支持中文翻译 这是本地化部署后的效果: 原命令为: docker run --rm -ti -p 8000:8000 -v readeck-data:/readeck codeberg.org/readeck/readeck:latest Unable to find image codeberg.org/readeck/readeck:la…...
duilib的应用 在双屏异分辨率的显示器上 运行显示不出来
背景:win11,duilib应用,双显示器,两台分辨率相同,分别设置不同的缩放以后,应用运行以后,程序闪一下消失或者程序还在,但是UI显示不出来。 原因 窗口风格设置不合理,所以…...
零代码快速开发智能体 |甘肃旅游通
在互联网信息爆炸的时代,寻找一处让人心动的旅游胜地往往需要花费大量的时间和精力。而今天,我要向大家介绍一款能够帮助你轻松规划甘肃之行的智能体——“甘肃旅游通”。这款智能体通过低代码开发,集合了丰富的旅游信息和个性化推荐功能&…...
【MATLAB源码-第187期】基于matlab的人工蜂群优化算法(ABC)机器人栅格路径规划,输出做短路径图和适应度曲线。
操作环境: MATLAB 2022a 1、算法描述 Artificial Bee Colony(ABC)算法是一种模仿蜜蜂觅食行为的优化算法,它通过模拟蜜蜂群体的社会结构和行为来解决数学优化问题。本文将详细介绍ABC算法的基本原理、算法流程、以及在实际应用…...
qt获取本地语言
获取本地语言 #define QSTRING_TO_UTF8(str) std::string(str.toUtf8()) enum LanguageType {kLanguageTypeChinese,kLanguageTypeTradition,kLanguageTypeEnglish };QLocale qlLanguage;QString qstrLangCode qlLanguage.languageToString(qlLanguage.language());LOG(INFO)…...
【Spring篇】Spring中的Bean管理
🧸安清h:个人主页 🎥个人专栏:【计算机网络】【Mybatis篇】 🚦作者简介:一个有趣爱睡觉的intp,期待和更多人分享自己所学知识的真诚大学生。 目录 🎯Spring IOC容器 Ὢ…...
UV灯 VS LED灯,LED美甲灯是紫外线灯吗?
美甲灯是使甲油胶固化的重要工具,目前最常用的美甲灯一般是UV灯、LED灯以及CCFL灯。 一、不同的灯之间到底有什么区别呢?这次让我们好好看一下 UV灯: UV灯是紫外线灯管的简称。UV灯属于热阴极荧光灯,发出UVA(长波紫…...
得物App3D博物馆亮相“两博会”,正品保障助力消费体验升级
近日,2024中国体育文化博览会、中国体育旅游博览会(以下简称“两博会”)在苏州国际展览中心盛大开幕。本次展会汇聚了众多国内外体育文化、体育旅游领域的顶尖企业和品牌,共同展示体育产业的发展成果和最新趋势。在C展馆C21展位&a…...
rancher安装并快速部署k8s 管理集群工具
主机准备 准备4台主机 3台用于k8s集群 ,1台用于rancher 每台服务器新增配置文件 vi etc/sysctl.confnet.ipv4.ip_forward 1 刷新生效 sysctl –p 安装docker 安装的时候可以去github上检索rancher看看最新版本适配那个版本的docker,这里安装23.0.1…...
NVR接入录像回放平台EasyCVR视频融合平台语音对讲配置
国标GB28181视频平台EasyCVR视频融合平台可拓展性强、视频能力灵活,平台可提供视频监控直播、云端录像、云存储、录像检索与回看、智能告警、平台级联、云台控制、语音对讲、智能分析接入等功能。其中,在语音对讲方面,NVR接入录像回放平台目前…...
八、Linux 系统安全:守护你的数字堡垒
Linux 系统安全:守护你的数字堡垒 在当今数字化时代,Linux 系统因其稳定性、高效性和开源性而被广泛应用于服务器、工作站以及各种嵌入式设备中。然而,随着网络攻击的日益频繁和复杂,确保 Linux 系统的安全变得至关重要。本文将深…...
PTA数据库编程练习合集
10-1 查询重量在[40,65]之间的产品信息 本题目要求编写SQL语句, 检索出product表中所有符合40 < Weight < 65的记录。 提示:请使用SELECT语句作答。 表结构: CREATE TABLE product (Pid varchar(20), --商品编号PName varchar(50), --商品名…...
分布式链路追踪-01初步认识SkyWalking
一 SkyWaling是什么? Skywalking是分布式系统的应用程序性能监视工具,专为微服务、云原生架构和基于容器(Docker、K8s、Mesos)架构而设计。SkyWalking 是观察性分析平台和应用性能管理系统,提供分布式追踪、服务网格遥…...
openpnp - 底部相机视觉识别CvPipeLine的参数bug修正
文章目录 openpnp - 底部相机视觉识别的CvPipeLine的参数bug概述笔记openpnp的视觉识别参数的错误原因备注补充 - 如果要直接改默认的底部视觉要注意END openpnp - 底部相机视觉识别的CvPipeLine的参数bug 概述 底部相机抓起一个SOD323的元件,进行视觉识别。 识别…...
C#从零开始学习(接口,强制转化和is)(7)
有时根据对象能做什么来分组,而不是根据他们继承的类.这就引入了接口 让无关的类做相同的动作 接口定义一个类必须实现的方法和属性 一个类实现一个接口时,必须包含接口中列出的所有方法和属性 向下强制转化 Appliance是CoffeeMaker的基类 Appliance powerConsumer new Co…...
算法Day-8
15. 三数之和 给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i ! j、i ! k 且 j ! k ,同时还满足 nums[i] nums[j] nums[k] 0 。请你返回所有和为 0 且不重复的三元组。 注意:答案中不可以包含重复的三元…...
屏蔽小米电视广告的方法
小米电视那个广告,太多,时间太长,影响观看感受,经过处理,成功屏蔽了小米电视的广告,提升了观影体验。 手动添加AD域名到 hosts 列表 小米(红米)电视关闭开机AD屏蔽hosts方法。 在路由器的hosts中配置。 …...
C#,自动驾驶技术,ASAM OpenDRIVE BS 1.8.0 规范摘要与C# .NET Parser
本文介绍自动驾驶技术的标准之一《ASAM OpenDRIVE》1.8.0 版本的规范摘要,及北京联高软件开发有限公司实现的 C# 版本 xodr 文件(XML) Parser 源代码。 本文档是 ASAM e.V. 的版权财产。 在更改常规许可条款时,ASAM 允许不受限制地…...
玩转PyCharm:常用操作和快捷键
常用操作和快捷键 PyCharm为写Python代码提供了自动补全和高亮语法功能,这也是PyCharm作为集成开发环境(IDE)的基本功能。PyCharm的“File”菜单有一个“Settings”菜单项(macOS上是在“PyCharm”菜单的“Preferences…”菜单项&…...
HeterGCL 论文写作分析
HeterGCL 论文写作分析 这篇文章,由于理论证明较少,因此写作风格了polygcl是两种风格的。polygcl偏向理论的写作风格,而hetergcl就是实践派的风格 首先看标题,其的重点是Graph contrastive learning Framework。其重点是framewo…...
简单的windows java -jar 无法启动jar包解决方法
简单的windows java -jar 无法启动jar包解决方法 1. 问题 我们项目是使用nacos作为注册中心以及配置中心,我们本地使用idea 进行服务配置以及启动发现没有问题,然后我们的服务经过maven install 打包后发布到LINUX服务启动也没有问题,但是我…...
iPhone图片/照片/视频复制到win10系统的简单方法 - 照片导出
效果图 不同方法: 【推荐】爱思助手 一步到位....【不推荐,会错漏很多照片】 1) 开始,打开开始菜单最后一个“照片” 2) 打开外部设备“Apple iPhone” 3) 全选,“添加xx项”,选择本地...
ctfshow-文件上传-151-161
CTFshow文件上传 PHP文件上传:1、代码思路 黑名单是设置不能通过的用户,黑名单以外的用户都能通过。 phtml、pht、php3、php4、php5后缀都会按做php文件执行,且不在黑名单内。 2、绕过 找漏网之鱼:cer、php3、php4、phtml等。 大小写绕…...
【Windows】Microsoft Office 的 .docx .xlsx .pptx 等文件图标消失,变成空白图标
问题描述 在重新安装 Microsoft Office 后,发现 .docx、.xlsx、.pptx 等文件的图标消失,变成一个空白的图标。 原因分析 可能是由于Office组件的快捷方式和图标的注册表损坏所导致的。注册表是Windows操作系统中用来存储系统和应用程序配置信息的一个重…...
场景化运营与定制开发链动 2+1 模式 S2B2C 商城小程序的融合
摘要:本文深入探讨了场景化运营的重要性以及其在商业领域的广泛应用。通过分析电梯广告、视频网站和电商产品的场景化运营方式,引入关键词“定制开发链动 21 模式 S2B2C 商城小程序”,阐述了如何将场景化运营理念融入到该小程序的开发与推广中…...
Axure中继器实现时间读取和修改
亲爱的小伙伴,在您浏览之前,烦请关注一下,在此深表感谢! 课程主题:中继器实现时间读取和修改 主要内容:中继器内不同时间格式的向外读取,和向内赋值,实现中继器时间的修改 应用场…...
数据库聚合函数
数据库聚合函数 聚合函数 sum ,avg,max,min,count 1总分 SELECT SUM(student_result) FROM result; SELECT student_no,SUM(studet_result) FROM result WHERE student_no62平均分 avg SELECT AVG(studet_result) FROM result;3最大值 max 最小值 min SELECT MAX(studet_r…...
天津网站建设定做/营销渠道名词解释
Linux用户通常可以轻松找到并安装软件。关于每个发行版都有一个软件仓库,带有一个漂亮的图形化前端。要安装程序,您通常只需要搜索它,然后按如果软件没有然后呢有时候,你别无选择,只能从源码编译Linux程序,…...
响应式网站设计案例/seo去哪里学
很抱歉,由于单片机AD转换的具体实现方法可能因不同的单片机型号和设备不同而有所差异,因此我不能简单地提供代码。但是,我可以提供一些指导,帮助您实现单片机的AD转换。 首先,您需要确定您所使用的单片机的型号&#x…...
南通网站排名优化/友情链接有什么用
1、学习程度来评判时间PHP包含的东西也很多,如果简单点,一个小留言板大概学了2个月就差不多了,但是PHP当中还有很多别的比如面向对象、GD库、cookie、session……。想要做个真正像样的网站,CSS、JS、SQL也是必不可少(ajax无非就是…...
做策划需要进的网站/网络营销的应用研究论文
jvm classLoader architecture : a, Bootstrap ClassLoader/启动类加载器主要负责jdk_home/lib目录下的核心 api 或 -Xbootclasspath 选项指定的jar包装入工作. b, Extension ClassLoader/扩展类加载器主要负责jdk_home/lib/ext目录下的jar包或 -Djava.ext.dirs 指定目录下的ja…...
岳阳市住房和城乡建设路网站/百度官方app下载
http://www.cnblogs.com/xucheng/p/tomcat_https.html转载于:https://www.cnblogs.com/sj521/p/5833080.html...
沈阳网站建设建设公司哪家好/创建属于自己的网站
6月28-29日,中国企业云服务大会,在上海小南国花园酒店正式召开。联想云、阿里云等众多产业内的领先品牌就企业云服务趋势、战略、大数据技术及应用等热门议题深度交流,并在展览区直观呈现云技术的落地成果。联想云存储副总经理张跃华在本次盛…...