当前位置: 首页 > news >正文

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() 函数把二进制数据 包装 / 解包 成 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 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容器 &#x1f6a…...

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语句&#xff0c; 检索出product表中所有符合40 < Weight < 65的记录。 提示&#xff1a;请使用SELECT语句作答。 表结构: CREATE TABLE product (Pid varchar(20), --商品编号PName varchar(50), --商品名…...

分布式链路追踪-01初步认识SkyWalking

一 SkyWaling是什么&#xff1f; Skywalking是分布式系统的应用程序性能监视工具&#xff0c;专为微服务、云原生架构和基于容器&#xff08;Docker、K8s、Mesos&#xff09;架构而设计。SkyWalking 是观察性分析平台和应用性能管理系统&#xff0c;提供分布式追踪、服务网格遥…...

openpnp - 底部相机视觉识别CvPipeLine的参数bug修正

文章目录 openpnp - 底部相机视觉识别的CvPipeLine的参数bug概述笔记openpnp的视觉识别参数的错误原因备注补充 - 如果要直接改默认的底部视觉要注意END openpnp - 底部相机视觉识别的CvPipeLine的参数bug 概述 底部相机抓起一个SOD323的元件&#xff0c;进行视觉识别。 识别…...

C#从零开始学习(接口,强制转化和is)(7)

有时根据对象能做什么来分组,而不是根据他们继承的类.这就引入了接口 让无关的类做相同的动作 接口定义一个类必须实现的方法和属性 一个类实现一个接口时,必须包含接口中列出的所有方法和属性 向下强制转化 Appliance是CoffeeMaker的基类 Appliance powerConsumer new Co…...

算法Day-8

15. 三数之和 给你一个整数数组 nums &#xff0c;判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i ! j、i ! k 且 j ! k &#xff0c;同时还满足 nums[i] nums[j] nums[k] 0 。请你返回所有和为 0 且不重复的三元组。 注意&#xff1a;答案中不可以包含重复的三元…...

屏蔽小米电视广告的方法

小米电视那个广告&#xff0c;太多&#xff0c;时间太长&#xff0c;影响观看感受&#xff0c;经过处理&#xff0c;成功屏蔽了小米电视的广告&#xff0c;提升了观影体验。 手动添加AD域名到 hosts 列表 小米(红米)电视关闭开机AD屏蔽hosts方法。 在路由器的hosts中配置。 …...

如何在看板中体现优先级变化

在看板中有效体现优先级变化的关键措施包括&#xff1a;采用颜色或标签标识优先级、设置任务排序规则、使用独立的优先级列或泳道、结合自动化规则同步优先级变化、建立定期的优先级审查流程。其中&#xff0c;设置任务排序规则尤其重要&#xff0c;因为它让看板视觉上直观地体…...

定时器任务——若依源码分析

分析util包下面的工具类schedule utils&#xff1a; ScheduleUtils 是若依中用于与 Quartz 框架交互的工具类&#xff0c;封装了定时任务的 创建、更新、暂停、删除等核心逻辑。 createScheduleJob createScheduleJob 用于将任务注册到 Quartz&#xff0c;先构建任务的 JobD…...

Python如何给视频添加音频和字幕

在Python中&#xff0c;给视频添加音频和字幕可以使用电影文件处理库MoviePy和字幕处理库Subtitles。下面将详细介绍如何使用这些库来实现视频的音频和字幕添加&#xff0c;包括必要的代码示例和详细解释。 环境准备 在开始之前&#xff0c;需要安装以下Python库&#xff1a;…...

【HarmonyOS 5 开发速记】如何获取用户信息(头像/昵称/手机号)

1.获取 authorizationCode&#xff1a; 2.利用 authorizationCode 获取 accessToken&#xff1a;文档中心 3.获取手机&#xff1a;文档中心 4.获取昵称头像&#xff1a;文档中心 首先创建 request 若要获取手机号&#xff0c;scope必填 phone&#xff0c;permissions 必填 …...

在Ubuntu24上采用Wine打开SourceInsight

1. 安装wine sudo apt install wine 2. 安装32位库支持,SourceInsight是32位程序 sudo dpkg --add-architecture i386 sudo apt update sudo apt install wine32:i386 3. 验证安装 wine --version 4. 安装必要的字体和库(解决显示问题) sudo apt install fonts-wqy…...

保姆级教程:在无网络无显卡的Windows电脑的vscode本地部署deepseek

文章目录 1 前言2 部署流程2.1 准备工作2.2 Ollama2.2.1 使用有网络的电脑下载Ollama2.2.2 安装Ollama&#xff08;有网络的电脑&#xff09;2.2.3 安装Ollama&#xff08;无网络的电脑&#xff09;2.2.4 安装验证2.2.5 修改大模型安装位置2.2.6 下载Deepseek模型 2.3 将deepse…...

springboot整合VUE之在线教育管理系统简介

可以学习到的技能 学会常用技术栈的使用 独立开发项目 学会前端的开发流程 学会后端的开发流程 学会数据库的设计 学会前后端接口调用方式 学会多模块之间的关联 学会数据的处理 适用人群 在校学生&#xff0c;小白用户&#xff0c;想学习知识的 有点基础&#xff0c;想要通过项…...

给网站添加live2d看板娘

给网站添加live2d看板娘 参考文献&#xff1a; stevenjoezhang/live2d-widget: 把萌萌哒的看板娘抱回家 (ノ≧∇≦)ノ | Live2D widget for web platformEikanya/Live2d-model: Live2d model collectionzenghongtu/live2d-model-assets 前言 网站环境如下&#xff0c;文章也主…...

mac:大模型系列测试

0 MAC 前几天经过学生优惠以及国补17K入手了mac studio,然后这两天亲自测试其模型行运用能力如何&#xff0c;是否支持微调、推理速度等能力。下面进入正文。 1 mac 与 unsloth 按照下面的进行安装以及测试&#xff0c;是可以跑通文章里面的代码。训练速度也是很快的。 注意…...

水泥厂自动化升级利器:Devicenet转Modbus rtu协议转换网关

在水泥厂的生产流程中&#xff0c;工业自动化网关起着至关重要的作用&#xff0c;尤其是JH-DVN-RTU疆鸿智能Devicenet转Modbus rtu协议转换网关&#xff0c;为水泥厂实现高效生产与精准控制提供了有力支持。 水泥厂设备众多&#xff0c;其中不少设备采用Devicenet协议。Devicen…...