pgcrypto

瀚高数据库
目录
环境
文档用途
详细信息

环境
系统平台:Linux x86-64 Red Hat Enterprise Linux 7
版本:14
文档用途
本文详细介绍pgcrypto。

详细信息

1、简介

pgcrypto是PostgreSQL的一个扩展模块,用于提供加密和密码散列功能。它扩展了 PostgreSQL 的功能,使其能够执行各种加密操作,包括对数据进行加密、生成密码散列以及其他与数据安全相关的功能。

pgcrypto提供了对称加密(symmetric encryption)和非对称加密(asymmetric encryption)的支持。对称加密用于加密和解密数据,而非对称加密用于创建和验证数字签名。这样就可以在数据库中存储加密数据,从而增加数据的安全性。只有具有相应权限的用户才能够解密数据。

pgcrypto 可以生成密码的散列(hash),这就可以在数据库中存储密码的散列值而不是密码明文。通过将用户密码的散列存储在数据库中,可以提高数据安全性。

pgcrypto支持数字签名和验证功能,可以创建数字签名以证明数据的完整性和来源,然后验证签名以确保数据未被篡改。

pgcrypto可以用于保护数据库中的敏感数据,如社会安全号码、信用卡号码等。通过对这些数据进行加密,即使数据库被未经授权的访问,也不会泄漏敏感信息。

PostgreSQL源码自带pgcrypto功能,而且从PostgreSQL 13开始,它被视为“受信任的”模块,可以使用对当前数据库具有CREATE权限的非超级用户安装。

2、安装配置

PostgreSQL官网提供的安装包已经编译好了此模块,登录数据库创建EXTENSION即可;源码编译安装的,先查询pg_available_extension_versions看是否存在pgcrypto,不存在则在源码包contrib/pgcrypto下编译安装,然后创建EXTENSION,命令如下:

[root@localhost pgcrypto]# pwd/home/postgis/postgresql-15.4/contrib/pgcrypto[root@localhost pgcrypto]# make installpostgres=# create extension pgcrypto;CREATE EXTENSION

创建EXTENSION后默认会在public下创建很多功能函数。

3、pgcrypto详细功能

pgcrypto模块向PostgreSQL提供加密函数,用于加密和解密数据,以及执行与密码学相关的操作;强大的加密功能,使得用户可以在数据库层面更安全地处理敏感数据。使用户可以在数据库级别实现数据的安全性和隐私保护,而不必依赖于应用程序层面的加密;对 于需要存储敏感信息的应用程序和系统来说非常有用。

pgcrypto提供的函数类型有:通用哈希函数,密码哈希函数,PGP加密函数,原始加密函数,随机数据函数。

3.1 通用哈希函数(General Hashing Functions)

此类函数通常用于处理数据的摘要计算和消息身份验证,pgcrypto提供的函数有:

1)digest()

digest(data text, type text) returns byteadigest(data bytea, type text) returns bytea

digest函数用于计算数据的哈希值,也称为消息摘要。哈希值是一个固定长度的二进制字符串,它是根据输入数据计算得出的,即使输入数据有微小的变化,哈希值也会有显著的不同。主要就是验证数据的完整性和唯一性。它可以帮助确保数据在传输或存储过程中没有被篡改,并且允许快速比较大量数据以查找相同的数据块。

示例1:以下是一个使用digest()函数计算哈希值的示例。

postgres=# SELECT digest('Hello World!', 'sha256');digest-----------------------------------------------------------\x7f83b1657ff1fc53b92dc18148a1d65dfc2d4b1fa3d677284addd200126d9069postgres=# SELECT digest('Hello World!', 'md5');digest------------------------------------\xed076287532e86365e841e92bfc50d8c

支持的算法包括md5、sha1、sha224、sha256、sha384、sha512,如果使用了OpenSSL,则可以支持更多的算法。

2)hmac()

hmac(data text, key text, type text) returns byteahmac(data bytea, key bytea, type text) returns bytea

hmac函数用于计算数据基于密钥的哈希值,也称为消息身份验证码(HMAC)。它使用一个密钥来计算数据的哈希值,并使用密钥来增加数据的安全性,以确保数据的完整性和来源。提供了密钥管理和数据完整性验证的一种方式。对于安全通信和验证来自受信任源的数据非常有用。

示例2:以下是一个使用 hmac函数计算哈希值的示例。

postgres=# SELECT hmac('Hello World!', 'secret_key','md5');hmac------------------------------------\x353f16791bf230dcaf1a318d9e2f7fd9

3.2 密码哈希函数(Password Hashing Functions)

此类函数用于安全地存储和验证用户密码,通常采用特定方法,以确保密码不以明文形式存储,从而提高安全性。提供的函数有crypt()和gen_salt():

gen_salt(type text [, iter_count integer ]) returns textcrypt(password text, salt text) returns text

示例3:使用gen_salt生成一个“密钥”,crypt引用“密钥”对密码进行加密。

postgres=# select gen_salt('bf');gen_salt-------------------------------$2a$06$A4966wmBLFyPOeqNxq.1c.postgres=# select crypt('password',gen_salt('bf'));crypt------------------------------------------------------$2a$06$x4Ygy9f54IoqPG2r2teSMOYSRUym0ItTCUg9041j57iNYX1T.clTe

gen_salt函数用于生成一个“密钥”,作为crypt函数进行密码哈希计算的一个参数,目的是使相同的密码在每次哈希时产生不同的哈希值,增强密码的安全性。gen_salt根据指定的算法标识符作为参数,生成相应的“密钥”。crypt使用这个“密钥”进行哈希,从而生成安全的哈希密码。

gen_salt支持的参数是固定的几个算法标识符,包括:

bf (Blowfish):Blowfish 是一种对称密码算法,通常用于密码哈希而不是加密数据。

md5 (MD5):常见的哈希算法,但现在很多场景都认为MD5算法不安全,容易受到暴力攻击。

xdes (Extended DES):Extended DES是DES(Data Encryption Standard)的扩展版本。

des (DES - Data Encryption Standard):比较老的对称密码算法。

在实际应用中,你通常会先使用gen_salt生成“密钥”,然后将“密钥”与密码一起传递给crypt函数,以生成密码的哈希值。这种做法确保每个用户的密码都有不同的哈希值,并提高了密码的安全性。

3.3 PGP加密函数(PGP Encryption Functions)

这部分函数基于OpenPGP(RFC 4880,PGP: Pretty Good Privacy)标准实现了加密,支持对称密钥和公钥加密。OpenPGP 是一种用于数据加密和数字签名的标准,通常用于保护通信的机密性和完整性。这类函数包括:

1) 对称密钥加解密

pgp_sym_encrypt(data text, psw text) returns byteapgp_sym_encrypt_bytea(data bytea, psw text) returns byteapgp_sym_decrypt(msg bytea, psw text) returns textpgp_sym_decrypt_bytea(msg bytea, psw text) returns bytea

pgp_sym_encrypt用于使用对称密钥加密数据,而pgp_sym_decrypt用于解密已加密的数据。这些函数可以在数据库中加密和解密数据,使用相同的对称密钥来保护数据的机密性。

示例4:使用pgp_sym_encrypt加密,pgp_sym_decrypt使用解密。

pg=# SELECT pgp_sym_encrypt('Hello, world', 'my_secret_key');                                                              pgp_sym_encrypt------------------------------------\xc30d0407030207639f8a0b1c9d9a7dd23d01325b92a8f85a2ba88a417cf81ed0546a0789b8dabb395bea7f67c7d5387a932c31700bb9c3ba492a9755ea7978919bd82388132a3c12d49f0af75306pg=# SELECT pgp_sym_decrypt('\xc30d0407030207639f8a0b1c9d9a7dd23d01325b92a8f85a2ba88a417cf81ed0546a0789b8dabb395bea7f67c7d5387a932c31700bb9c3ba492a9755ea7978919bd82388132a3c12d49f0af75306', 'my_secret_key');pgp_sym_decrypt-----------------Hello, world

2) 公钥加解密相关函数

pgp_pub_encrypt(data text, key bytea [, options text ]) pgp_pub_encrypt_bytea(data bytea, key bytea [, options text ]) pgp_pub_decrypt(msg bytea, key bytea [, psw text [, options text ]])pgp_pub_decrypt_bytea(msg bytea, key bytea [, psw text [, options text ]])armor(data bytea [ , keys text[], values text[] ]) dearmor(data text) returns byteapgp_key_id(bytea)

pgp_pub_encrypt使用公钥加密数据,pgp_pub_decrypt用于解密使用公钥加密的数据。其中加密操作使用接收方的公钥进行加密,只能由拥有相应私钥的接收方解密。通常用于安全地共享数据,确保只有指定接收方能够解密数据。

dearmor函数将文本类型解包为PGP ASCII-armor格式,armor功能相反;pgp_key_id是从ASCII-armor格式的密钥中提取密钥ID。

示例5:使用公钥加密,私钥解密的全过程。

–使用gpg生成密钥,过程中需要输入管理密钥的密码等多个操作

[root@local]#  gpg --gen-key[root@local]#  gpg --list-secret-keys[root@local]#  gpg -a --export KEYID > public.key[root@local]#  gpg -a --export-secret-keys KEYID > secret.key--此时在当前目录下会生成public.key和secret.key,生成的key很长,我们将其插入数据库保存为text,方便使用--使用dearmor()将密钥key转为bytea格式postgres=# select dearmor(pk) from pgp_key;--使用pgp_key_id()提取密钥IDpostgres=# select pgp_key_id(dearmor(pk)) from pgp_key;pgp_key_id------------------5328EEB323D497975328EEB323D49797--pgp_pub_encrypt加密postgres=# select  pgp_pub_encrypt('Hello World!',dearmor(pk)) from pgp_key where c1 = 'public';--pgp_pub_decrypt解密postgres=# with t as (select pgp_pub_encrypt('Hello World!',dearmor(pk)) as pub from pgp_key where c1 = 'public')select pgp_pub_decrypt(t.pub,dearmor(pk)) from t, pgp_key where c1 = 'secret';

3.4 “原文”加密函数(Raw Encryption Functions)

此类函数使用用户提供的密钥执行加密操作,不会对密钥进行操作;不会检查数据完整性,也无法保证数据在传输或存储过程中不被篡改;随着PGP加密功能的引入,不推荐再使用这类函数。

但这些函数使用简单以及实际的安全性,这些函数成为最常用的函数,包括:

encrypt(data bytea, key bytea, type text)decrypt(data bytea, key bytea, type text)encrypt_iv(data bytea, key bytea, iv bytea, type text) decrypt_iv(data bytea, key bytea, iv bytea, type text)示例6:使用encrypt加密,使用decrypt解密。postgres=# select encrypt('Hello World!'::bytea,'key'::bytea,'bf');postgres=# select decrypt(encrypt('Hello World!'::bytea,'key'::bytea,'bf'),  'key'::bytea,  'bf'::text)::text;

3.5 随机数据函数(Random-Data Functions)

这些函数用于生成随机数据,返回uuid或bytea类型, 随机数据在密码学、模拟和许多其他计算领域都有广泛的应用。UUID是128位长,通常表示为32个十六进制字符(包括连字符)。这些随机数通常具有唯一性,一般用于数据库表的主键,或任何需要唯一标识符的场景,这些函数包括:

gen_random_bytes(count integer) returns byteagen_random_uuid() returns uuid

gen_random_bytes()函数用于生成加密密钥、初始化向量(IV)等需要高质量随机数据的场景;gen_random_uuid()用于生成uuid,生成唯一的字符串。

示例7:生成随机数据

postgres=# SELECT gen_random_bytes(10);gen_random_bytes------------------------\x715c54f2564f778c58e6postgres=# select gen_random_uuid();gen_random_uuid--------------------------------------f15f7743-c37d-4c75-977e-c974374685a7

4、最佳实践

pgcrypto提供的一系列函数,为PostgreSQL提供了强大的数据加密功能,使PostgreSQL能够满足各种数据安全场景的保密要求。

pgcrypto针对密码学操作提供了广泛使用的算法,包括AES、RSA、SHA-2等,这些算法经过广泛测试和验证,能够提供高度的数据安全性。它与数据库引擎紧密集成,充分利用了数据库的安全特性。由于与PostgreSQL高度集成,pgcrypto 可以充分利用数据库性能。

pgcrypto提供的函数对于初学者来说相对复杂,无法实现开箱即用,导致它用户很少,或只是使用了相对简单的一些功能;一些只是对密码加密的场景,用户在应用端加密要比在数据库端加密容易的多。数据的加解密操作必然会浪费一定的硬件资源,对于大体量数据场景,需要小心谨慎,否则会严重影响性能或导致更大的问题。

5、卸载

pgcrypto功能是PostgreSQL源码自带,因此pgcrypto EXTENSION的卸载,只需移除EXTENSION,移除前请确认是否还依赖pgcrypto提供的所有对象,移除时会把这些对象全部移除。

操作命令:

--删除extensiondrop extension pgcrypto;

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

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

相关文章

Java代码基础算法练习-拆分一个三位数的个位、十位、百位-2024.04.14

任务描述:输入一个三位数,逆序输出这个三位数的个位、十位、百位对应的数字,用空格分开。 任务要求: 代码示例: package April_2024;import java.util.Scanner; public class a240414 {public static void main(Strin…

972: 统计利用先序遍历创建的二叉树的宽度

解法&#xff1a; #include<iostream> #include<queue> using namespace std; // 定义二叉树结点 struct TreeNode {char val;TreeNode* left;TreeNode* right;TreeNode(char x) :val(x), left(NULL), right(NULL) {}; }; // 先序递归遍历建立二叉树 TreeNode* bu…

深入理解 copyWithin:提升JavaScript图形处理中数组数据的复用与变换能力

引言 copyWithin 是 JavaScript 中数组对象的一个实例方法&#xff0c;用于在数组内部进行元素的复制和移动。从数组的指定位置拷贝元素到另一个指定位置&#xff0c;覆盖原数组中的相应位置。它不会改变数组的长度。 copyWithin 方法解析 语法&#xff1a; arr.copyWithin…

【uniapp】状态存储Pinia的使用,以及它的数据持久化

1、下载安装pinia&#xff0c;引入pinia //stores->index.ts import { createPinia } from pinia import persist from pinia-plugin-persistedstate //持久化插件// 创建 pinia 实例 const pinia createPinia() // 使用持久化存储插件 pinia.use(persist)// 默认导出&…

spark实验三-spark进阶编程

1&#xff0e;Spark编程统计各地区租房人数 实验目标&#xff1a; (1) 掌握在IntelliJ IDEA 中操作spark程序开发 (2) 打包程序提交集群运行 实验说明&#xff1a; 现有一份某省份各地区租房信息文件 house.txt&#xff0c;文件中共有8个数据字段&#xff0c;字段说明…

vue 项目中添加DES加密

vue 项目中添加DES加密 由于现在项目使用http协议&#xff0c;且登录界面是明文传输&#xff0c;项目真正上线后基本的密码传输都很不安全。 决定用前端框架加密后再进行传输&#xff0c;以提高密码传输过程中的安全性。 crypto-js 是一个流行的 JavaScript 加密库&#xff0…

vxe-vxe-toolbar中vxe-button选中切换status

1.VXE-Toolbar 在VXE-Toolbar中&#xff0c;可以使用vxe-button组件实现按钮的选中切换效果&#xff0c;并且可以根据不同的选中状态显示不同的样式。你可以通过设置status属性来控制按钮的选中状态&#xff0c;并通过监听按钮的点击事件来切换选中状态。需要在vxe-toolbar中添…

服务器配置ssh免密登录

需求:备份test10.22.33.96上的文件到 test10.22.33.97的定时脚本,需要使用scp命令传输文件,两台节点没有ssh互信,需要配置服务器之间的SSH互信为了让两台或多台服务器之间能够无密码自动登录 步骤1&#xff1a;生成密钥对 在每一台需要建立互信的服务器(test10.22.33.96)上执…

每日两题1

文章目录 使用最小花费爬楼梯91解码方法 使用最小花费爬楼梯 class Solution { public:int minCostClimbingStairs(vector<int>& cost) {if(cost.size() 2)return min(cost[0],cost[1]);vector<int> dp;dp.reserve(cost.size()1);dp[0] 0;dp[1] 0;for(int i…

【域适应】基于深度域适应MMD损失的典型四分类任务实现

关于 MMD &#xff08;maximum mean discrepancy&#xff09;是用来衡量两组数据分布之间相似度的度量。一般地&#xff0c;如果两组数据分布相似&#xff0c;那么MMD 损失就相对较小&#xff0c;说明两组数据/特征处于相似的特征空间中。基于这个想法&#xff0c;对于源域和目…

顶切,半顶切是什么意思?

齿轮加工及刀具中有一些特定名词或者叫法&#xff0c;不熟悉的小伙伴可能最开始会有一些困惑&#xff0c;这不&#xff0c;最近有小伙伴问了一个问题&#xff1a;顶切是说齿顶的倒角吗&#xff1f; 今天就给大家说说顶切和半顶切。 一、顶切 Topping 从字面上可以看到可以想到…

Swagger API 文档 | SpringCloudGateway 集成 SpringDoc

文章目录 工作原理方案 1:配置 swagger-ui.urls方案 2:通过路由定义动态配置具体案例第 1 步:导入代码第 2 步:配置 Swagger Url 列表第 3 步:启动程序第 4 步:查看注册中心第 5 步:访问网关 Swagger UI相关博文😎 本节目标: Spring Cloud Gateway 集成 SpringDoc,实…

MySQL的权限管理

MySQL的权限管理 在理解MySQL的权限管理之前&#xff0c;我们需要先了解其架构设计以及权限管理在该架构中的定位。 MySQL的架构设计 MySQL数据库系统采用了分层的架构设计&#xff0c;主要可以分为以下几个层级&#xff1a; 连接层&#xff1a;最外层&#xff0c;处理连接…

x264 8x8 水平预测汇编分析

C 语言代码 void s264_predict_8x8_h_c( pixel *src, pixel edge[36] ) { PREDICT_8x8_LOAD_LEFT #define ROW(y) MPIXEL_X4( srcy*FDEC_STRIDE0 ) \ MPIXEL_X4( srcy*FDEC_STRIDE4 ) PIXEL_SPLAT_X4( l##y ); ROW(0); ROW(1); ROW(2); ROW(3); ROW(4); ROW(5); ROW(6); ROW(7…

VUE3:自定义loading指令

一、效果描述 在一个div中使用该指令并绑定一个变量&#xff0c;通过修改变量实现Loading的显示与隐藏。 二、代码与使用方式 1.使用指令的vue组件 <template><div v-loading"showLoading"></div> </template> <script setup lang&q…

爬虫 selenium

爬虫 selenium 【一】介绍 【1】说明 Selenium是一款广泛应用于Web应用程序测试的自动化测试框架 它可以模拟用户再浏览器上的行为对Web应用进行自动化测试 主要作用&#xff1a; 浏览器控制&#xff1a;启动、切换、关闭不同浏览器元素定位于操作&#xff1a;通过CSS选择器…

vscode中运行js

vscode中运行js 目前vscode插件运行js都是基于node环境&#xff0c;vscode控制台打印有些数据不方便等缺点。 每次调试在浏览器中运行js&#xff0c;需要创建html模板、插入js。期望能够直接运行js可以打开浏览器运行js&#xff0c;在vscode插件市场找到一款插件可以做到。 插…

yolo系列(之一)

深度学习经典检测算法 two-stage (两阶段) : Faster-rcnn Mask-Rcnn系列 &#xff08;输入图像---》CNN特征---》预选框---》输出结果&#xff09; one-stage (单阶段): YOLO系列 &#xff08;输入图像---》CNN特征---》输出结果&#xff09; one-stage的特点&#xff1a;&…

深度学习学习日记4.15 (面向GPT学习)

精确学习时间&#xff08;09点35分开始&#xff09; 深度学习 torch.nntorch.utils.datanumpytorchvision中的模块有哪些os 模块PIL&#xff08;Python Imaging Library&#xff09;tqdmmatplotlibnn.ReLU inplace参数设为Truenn.relu 训练的迭代过程梯度清零loss指标计算为什…

2024 蓝桥打卡Day40

2021、2022年蓝桥杯真题练习 2021年蓝桥杯真题练习A ASCB 卡片C 查找D 货物摆放F 时间显示H 杨辉三角形 2022年蓝桥杯真题练习A 星期计算B 山C 字符统计D 最少刷题数E 求阶乘 2021年蓝桥杯真题练习 A ASC package THL_0412;public class A_2021 {public static void main(Str…