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

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

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

相关文章

TypeScript基础简介

TypeScript是Javascript的一个超集。 TypeScript在原有的基础之上又添加了编译器类型检查的功能,意味着如果使用ts进行开发,会对变量的类型进行较为严格的验证,防止程序员写出可能出错的代码,规范变成习惯,适合大项目开…

关于我的数据库——MySQL——第四篇

(叠甲:如有侵权请联系,内容都是自己学习的总结,一定不全面,仅当互相交流(轻点骂)我也只是站在巨人肩膀上的一个小卡拉米,已老实,求放过)。 函数 函数名称描…

SwitchHosts快速修改host文件

中文说明 https://github.com/oldj/SwitchHosts/blob/master/README.zh_hans.md 下载地址 https://github.com/oldj/SwitchHosts/releases 搭配域名对应的ip地址查询工具DNS Checker - DNS Check Propagation Tool

网络搜索引擎Shodan(2)

声明:学习视频来自b站up主 泷羽sec,如涉及侵权马上删除文章 声明:本文主要用作技术分享,所有内容仅供参考。任何使用或依赖于本文信息所造成的法律后果均与本人无关。请读者自行判断风险,并遵循相关法律法规。 感谢泷…

Windows 和 Linux 下常用命令(待更新)

Windows PowerShell 命令 1. 获取命令帮助信息 Get-Help [命令]2. 解决 Windows 平台下由于 “你需要权限才能执行此操作” 导致的文件夹删除失败 rm [需要删除的文件或文件夹] -Recurse -ForceLinux 命令 1. grep 使用正则表达式匹配字符串 grep -o -P [PATTERNS] [FILES…

Vue 项目中 Webpack 常见问题详解

前言 在Vue.js项目中,Webpack 作为打包工具,处理各种静态资源和模块化的代码打包需求。尽管 Webpack 在 Vue CLI 项目中已经配置好了一些默认行为,但开发者在实际项目中仍然会遇到许多与资源管理、public 和 assets 目录、require 语法等相关…

【力扣 | SQL题 | 每日4题】力扣2004, 1454,1613,1709

1. 力扣2004:职员招聘人数 1.1 题目: 表: Candidates ------------------- | Column Name | Type | ------------------- | employee_id | int | | experience | enum | | salary | int | ------------------- employee_id是此表的主键列。 经…

dfs复习(一)

题目在蓝桥云课上&#xff1a; 1.四位密码锁 四层&#xff0c;每层遍历所有可能的数字。 #include <bits/stdc.h> using namespace std; typedef long long ll; int sum0; void dfs(int depth,int ans) {if(depth4) //不再递归 {if(ans384) {sum;}return;}for(int i…

Python 从入门到实战40(数据分析概述)

我们的目标是&#xff1a;通过这一套资料学习下来&#xff0c;可以熟练掌握python基础&#xff0c;然后结合经典实例、实践相结合&#xff0c;使我们完全掌握python&#xff0c;并做到独立完成项目开发的能力。 上篇文章我们讨论了通过线程的相关知识。今天学习一下数据分析相…

#网络安全#渗透测试# 渗透测试应用

网络安全渗透测试是一种重要的安全评估方法&#xff0c;用于发现和评估网络系统中的安全漏洞。在进行渗透测试时&#xff0c;需要注意以下几个关键点&#xff1a; 法律和道德考量 获得授权&#xff1a;在进行渗透测试之前&#xff0c;必须获得目标系统的正式授权。未经授权的测…

python实现数据库的增删改查功能,图形化版本

import tkinter from tkinter import * import psycopg2 from tkinter import messagebox#连接信息 t_conn{"dbname": "d1","user": "u1","password": "123qqq...A","port": "15400","h…

vue+spreadjs开发

创建vue3项目 pnpm create vite --registryhttp://registry.npm.taobao.org安装spreadjs包 pnpm install "grapecity-software/spread-sheets17.1.7" "grapecity-software/spread-sheets-resources-zh17.1.7" "grapecity-software/spread-sheets-vu…

基于DDPG算法的股票量化交易

项目源码获取方式见文章末尾&#xff01; 回复暗号&#xff1a;13&#xff0c;免费获取600多个深度学习项目资料&#xff0c;快来加入社群一起学习吧。 **《------往期经典推荐------》**项目名称 1.【基于PyQTFaceNet卷积神经网络实现的学生人脸识别考勤系统】 2.【卫星图像道…

计算机强校99+分《数据库》课设

高校成绩数据库系统设计与实现 1、需求分析 1.1 数据需求描述 1.2 系统功能需求 1.3 其他性能需求 2、概念结构设计 2.1 局部E-R图 2.2 全局E-R图 2.3 优化E-R图 3、逻辑结构设计 3.1 关系模式设计 3.2 数据类型定义 3.3 关系模式的优化 4、物理结构…

川渝地区软件工程考研择校分析

C哥专业提供——计软考研院校选择分析专业课备考指南规划 通过最新数据分析,5所高校软件工程专业2025年考研难度从高到低预计为: 电子科技大学 >> 四川大学 > 重庆大学 ≈ 西南交通大学 > 西南大学 对于想考川渝地区985但核心目标为优先上岸的考生,建议重点考虑西…

gin入门教程(9):路由分组与路由版本控制

在使用 Gin 框架构建 RESTful API 时&#xff0c;路由分组与版本控制是一种常见的实践&#xff0c;可以帮助你更好地管理不同版本的 API。下面是如何在 Gin 中实现路由分组和版本控制的示例。 目录结构 /hello-gin │ ├── cmd/ │ └── main.go ├── api/ │ ├─…

Spring Boot助力的厨艺互动平台开发指南

2 相关技术 2.1 Spring Boot框架简介 Spring Boot是由Pivotal团队提供的全新框架&#xff0c;其设计目的是用来简化新Spring应用的初始搭建以及开发过程。该框架使用了特定的方式来进行配置&#xff0c;从而使开发人员不再需要定义样板化的配置。通过这种方式&#xff0c;Sprin…

web 应用层接口请求日志

需求&#xff1a; 前文已经讲过如何使用MDC在日志中为每个请求生成一个唯一traceID&#xff0c;日志生成traceID。 请求作为入口&#xff0c;一般的系统都会有一个表 或者 文件 记录每个请求&#xff0c;方便运维统计接口调用情况&#xff0c;实现方案大体两种&#xff1a; 使用…

在浏览器里就可以运行的本地AI模型 - 一键去除图片背景AI

前言 浏览器的功能越来越强大, 从Chrome 113 开始, 谷歌把WebGPU引入到了浏览器中, 通过WebGPU的API, 可以直接访问本机电脑的GPU资源. 既然GPU资源可以在浏览器里运行, 给AI模型推理等带来了便利, 使得一些AI模型可以直接在浏览器里运行. 本文主要介绍介绍以下WebGPU的基本概…

【前端开发入门】JavaScript快速入门--js变量

目录 引言一、为什么要定义变量二、定义变量的一些技巧1. 解构赋值1.1 Object解构赋值1.2 Array解构赋值1.3 总结规律 2. 字符串拼接 三、变量作用域四、总结 引言 本系列教程旨在帮助一些零基础的玩家快速上手前端开发。基于我自学的经验会删减部分使用频率不高的内容&#xf…