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

PostgreSQL 数据加密怎么弄,应该用哪种方案

开头还是介绍一下群,如果感兴趣PolarDB ,MongoDB ,MySQL ,PostgreSQL ,Redis, Oceanbase, Sql Server等有问题,有需求都可以加群群内有各大数据库行业大咖,CTO,可以解决你的问题。加群请联系 liuaustin3 ,(共2150人左右 1 + 2 + 3 + 4 +5) 新人奖直接分配到5群,另欢迎 OpenGauss 的技术人员加入。

5601104e537de28ca25cccc0aba036e0.png

数据库加密这个话题在很多大型企业的数据库安全规范中是有严格的要求的,这里数据库加密可以分为2个部分,实际上3个部分,这里由于其中一个部分在很多情况下并不实用,所以我们这边就不讨论了。

加密的方案

1  针对数据库中的数据进行加密

2   在数据传输中进行数据的加密

两种加密方案应对的需求不一样,应对的需求也不一样,数据中的数据加密,主要是针对敏感的数据存储在数据库中的不安全导致的,他需要存在数据库中的数据本身就是加密的,数据仅仅在读取的时候会进行解密,返回正常的数据,平时直接进行查看的时候,字段中的数据是被加密的。

另一种是在数据传输的过程中,处于加密,在数据中间传输环节保证数据的安全性。一个是针对存储,一个是针对传输环节。

那么我们兵分两路,先说存储环节

存储环节

案例1  用户的密码

用户的密码是一些系统中经常存在需要存储的部分,这部分数据在存储环节如何保证对于用户是安全的,不会在数据存储的部分被泄密,首选需要数据存储中的加密是不可逆的。

这里PostgreSQL 中有一个扩展为pgcrypto,其中有一个函数为生成hash函数的功能,digest ,这个部分在生成后,为不可逆的。例如我们这样操作

create table ency_table (
id serial primary key,
name varchar(20),
password varchar(41),
ency varchar(5) );
est=# insert into ency_table (name,password,ency) values ('John',digest('system_password','sha'),'sha');
INSERT 0 1
test=# select * from ency_table;id | name |                  password                  | ency 
----+------+--------------------------------------------+------1 | John | \x8892c3c9541f29a778b8ad675ca77f2a27e86540 | sha(2 rows)

基于这样的加密后的数据,是无法进行解密的,所以在用户输入密码后,也需要加密后,与存储的password 进行比对。

如下面的方式,可以进行密码的验证和比对以及登录的工作。

test=# select * from ency_table where password = (select digest('system_password','sha'))::varchar(50);id | name |                  password                  | ency 
----+------+--------------------------------------------+------1 | John | \x8892c3c9541f29a778b8ad675ca77f2a27e86540 | sha

案例2  存储加密信息,提取解密信息

这个是大多数在数据库中解决加解密的一个普通需求,虽然在日常的工作中我认为,加解密都应该是程序来做的,但是我们数据库的提供方案,比如下面的一个方案。

test=# insert into customer_table (name,phone,mail_address,ency) values ('John',encrypt('123456789012345','1234','aes'),encrypt('123456789012345','1234','aes'),'aes');
INSERT 0 1
test=# \d customer_tableTable "public.customer_table"Column    |         Type          | Collation | Nullable |                  Default                   
--------------+-----------------------+-----------+----------+--------------------------------------------id           | integer               |           | not null | nextval('customer_table_id_seq'::regclass)name         | character varying(20) |           |          | phone        | character varying(50) |           |          | mail_address | character varying(50) |           |          | ency         | character varying(5)  |           |          | 
Indexes:"customer_table_pkey" PRIMARY KEY, btree (id)test=# select * from customer_table;id | name |               phone                |            mail_address            | ency 
----+------+------------------------------------+------------------------------------+------1 | John | \x34591627f9c8eae417fc7cbbf458592c | \x34591627f9c8eae417fc7cbbf458592c | aes
(1 row)test=#

这里可以通过语句来进行数据解密,这里有一个核心点,数据已经被加密存储在数据库中,如果没有这个字段加密的方法和这个字段加密的秘钥是无法对这个数据进行解密的。

这里的秘钥是1234  加密方法是aes,通过这样的方案可以针对数据库中的特定的表的数据进行加密的计算和解密的提取,基本上不需要程序有相关的变动,属于数据库节点的方案。

select id,name,convert_from(decrypt(phone::bytea,'1234','aes'),'SQL_ASCII') as phone, convert_from(decrypt(mail_address::bytea,'1234','aes'),'SQL_ASCII') as mail_address from customer_table;

test=# 
test=# select id,name,convert_from(decrypt(phone::bytea,'1234','aes'),'SQL_ASCII') as phone, convert_from(decrypt(mail_address::bytea,'1234','aes'),'SQL_ASCII') as mail_address from customer_table;id | name |      phone      |  mail_address   
----+------+-----------------+-----------------1 | John | 123456789012345 | 123456789012345
(1 row)test=#

但这里需要提示一些使用这样方案的问题点,首先在大部分开发项目中使用的是框架,他们封装了SQL的生成的过程,,所以以上的方案可能不适合这类系统,因为开发者无法进行语句的修改,达到上面数据的加密和解密的目的,如果使用了手动编写SQL的方案,所以大部分方案都是由程序在产生数据的程序中将核心的数据进行加密,在加密数据提取后,在程序中解密的方案,所以以上的方案仅仅为一个借鉴。

最后还有基于TDE的PostgreSQL加密的方案,percona 退出基于PG16的TDE 方案,如果你的数据库已经使用了PG16 可以尝试这个方案,具体参见,TDE加密的方案中包含了用户的数据,TOAST表等,但愿数据库不会被加密,同时WAL数据也会被加密,临时表也会,但需要特别注意的是,这样的方案不支持逻辑复制,有使用逻辑复制的PG数据库系统,不要使用TDE的方案来进行数据的加密和解密。

https://percona-lab.github.io/pg_tde/main/

aa4ff9870f2f4e16cfcc240a8ce874c9.png

相关文章:

PostgreSQL 数据加密怎么弄,应该用哪种方案

开头还是介绍一下群,如果感兴趣PolarDB ,MongoDB ,MySQL ,PostgreSQL ,Redis, Oceanbase, Sql Server等有问题,有需求都可以加群群内有各大数据库行业大咖,CTO,可以解决你的问题。加群请联系 liuaustin3 ,(…...

1.通过AD组策略如何做封禁高危端口的策略?AD域控如何给加域的电脑做指定端口号封禁呢?

目录 (1)高危端口简介 1. 高危端口TCP和UDP类型 2.为什么要做AD组策略封禁加域计算机的一些高危的端口?好处是什么? (2)实战步骤过程 实验环境 第一步:新建计算机策略-编辑 第二步:将策略应用到OU...

05.BOM对象

一、js组成 JavaScript的组成 ECMAScript: 规定了js基础语法核心知识。比如:变量、分支语句、循环语句、对象等等 Web APIs : DOM 文档对象模型, 定义了一套操作HTML文档的APIBOM 浏览器对象模型,定义了一套操作浏览器窗口的API 二、windo…...

【Golang星辰图】Go语言游戏开发:选择合适的库加速你的开发过程

打造出色的游戏体验:使用Go库进行游戏和图形开发 前言 Go语言通过其简洁、高效和并发性的特性,逐渐在开发领域中崭露头角。对于游戏和图形开发,Go也有一些优秀的库和引擎可供选择。本文将介绍几个流行的Go库,包括ebiten、raylib…...

51单片机-AT24C02(I2C总线)

目录 一,介绍及元件工作原理 7.时序结构(重要) 8.i2C总线数据帧(重要) 二,应用 一,介绍及元件工作原理 1.元件介绍 2.存储器 3.地址总线和数据总线 地址总线只能一次选中一行 4.引脚及应用…...

面试经典-MySQL篇

一、MySQL组成 MySQL数据库的连接池:由一个线程来监听一个连接上请求以及读取请求数据,解析出来一条我们发送过去的SQL语句SQL接口:负责处理接收到的SQL语句查询解析器:让MySQL能看懂SQL语句查询优化器:选择最优的查询…...

C#控制台贪吃蛇

Console.Write("");// 第一次生成食物位置 // 随机生成一个食物的位置 // 食物生成完成后判断食物生成的位置与现在的蛇的身体或者障碍物有冲突 // 食物的位置与蛇的身体或者障碍物冲突了,那么一直重新生成食物,直到生成不冲突…...

[小程序开发] 构造页面

一、Component方法 Component方法用于创建自定义组件,小程序页面也可以使用Component方法进行创建,从而实现复杂的页面逻辑开发。 使用Component方法构造页面,可以实现更加复杂的页面逻辑开发。 二、注意事项 1、要求.json文件中必须包含usi…...

安装Android Studio遇到Unable to access Android SDK add-on list的错误

第一次安装android studio的时候,提示:unable to access Android sdk add-on list 解决办法 这个错误一般是android studoi代理没有设置导致的,需要在setting里面设置: 点击Android Studio - Preferences,在 Appeara…...

EXCEL+PYTHON学习3

1) 遍历一个SHEET,无非就是两个循环,rows属性是取得所有行。 fn data3_16.xlsx wb openpyxl.load_workbook(fn) ws wb.active for row in ws.rows:for cell in row:print(cell.value, end )print() 2) 返回工作表的最小行数…...

Rabbit MQ详解

写在前面,由于Rabbit MQ涉及的内容较多,赶在春招我个人先按照我认为重要的内容进行一定总结,也算是个学习笔记吧。主要参考官方文档、其他优秀文章、大模型问答。自己边学习边总结。后面有时间我会慢慢把所有内容补全,分享出来也是希望可以给…...

uniapp 写安卓app,运行到手机端 调试

手机 设置》关于手机》点击版本号 4-5次,弹出手机锁屏页面,输入手机锁屏密码 2.手机 设置中 》搜索 开发人员选项 》 调试》打开USB调试 同页面 找到 选择USB配置》选择 MIDIhbuilder 编辑器 点击 》运行》运行到手机或模拟器》运行到Android App基座 》…...

uniapp 实现双击点赞出现特效

更新一下 老板改了需求要加上特效 1. 创建点赞按钮 首先&#xff0c;在你的页面中创建一个点赞按钮 全局点赞的话就写在最外面的标签就行了。你可以使用 <button> 组件或者自定义一个视图组件。 <template> <view class"container"> <but…...

分布式搜索引擎elasticsearch(2)

1.DSL查询文档 elasticsearch的查询依然是基于JSON风格的DSL来实现的。 1.1.DSL查询分类 Elasticsearch提供了基于JSON的DSL&#xff08;[Domain Specific Language](https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl.html)&#xff09;来定义查…...

如何实现一个栈或队列?

如何实现一个栈或队列&#xff1f; 栈&#xff08;Stack&#xff09;和队列&#xff08;Queue&#xff09;是两种常见的数据结构&#xff0c;它们在编程中经常被使用。下面我将分别解释如何使用Python来实现这两种数据结构。 1. 栈的实现 栈是一种后进先出&#xff08;LIF…...

STM32输入捕获频率和占空比proteus仿真失败

这次用了两天的时间来验证这个功能&#xff0c;虽然实验没有成功&#xff0c;但是也要记录一下&#xff0c;后面能解决了&#xff0c;回来再写上解决的办法&#xff1a; 这个程序最后的实验结果是读取到的CCR1和CCR2的值都是0&#xff0c;所以没有办法算出来频率和占空比。 还…...

Kafka-SSL笔记整理

创建密钥仓库以及CA 创建密匙仓库,用户存储证书文件keytool -keystore server.keystore.jks -alias hello_kafka -validity 100000 -genkey创建CAopenssl req -new -x509 -keyout ca-key -out ca-cert -days 100000将生成的CA添加到客户端信任库keytool -keystore client.trus…...

Mysql挂掉怎么办

思路 从库处理&#xff0c;relaylog&#xff0c;讲从库升级主库。 待主机恢复后&#xff0c;主机替换为从库。 具体操作 简介&#xff1a; 主库宕机 Master DOWN机-企业场景一主多从宕机从库切换主继续和从同步过程详解 登陆从库&#xff0c;show processlist; 查看两个线…...

《工厂模式(极简c++)》

本文章属于专栏《设计模式&#xff08;极简c版&#xff09;》 继续上一篇《设计原则》。本章简要说明工厂模式。本文分为模式说明、本质思想、实践建议、代码示例四个部分。 模式说明&#xff1a; 简单工厂模式 方案&#xff1a;对象不直接new&#xff0c;而是通过另一个类&am…...

前端学习笔记|JavaScript基础

JS基础 数据类型 基于动力节点视频。 Number、String、Boolean、object 强制转换 Number 强转,boolean强转(undefined、null、NaN都是转成false)&#xff0c;String强转 myAge Number("123445"); Boolean(0); String(123);parseInt、parseFloat 遇到非数字&…...

超短脉冲激光自聚焦效应

前言与目录 强激光引起自聚焦效应机理 超短脉冲激光在脆性材料内部加工时引起的自聚焦效应&#xff0c;这是一种非线性光学现象&#xff0c;主要涉及光学克尔效应和材料的非线性光学特性。 自聚焦效应可以产生局部的强光场&#xff0c;对材料产生非线性响应&#xff0c;可能…...

PPT|230页| 制造集团企业供应链端到端的数字化解决方案:从需求到结算的全链路业务闭环构建

制造业采购供应链管理是企业运营的核心环节&#xff0c;供应链协同管理在供应链上下游企业之间建立紧密的合作关系&#xff0c;通过信息共享、资源整合、业务协同等方式&#xff0c;实现供应链的全面管理和优化&#xff0c;提高供应链的效率和透明度&#xff0c;降低供应链的成…...

前端导出带有合并单元格的列表

// 导出async function exportExcel(fileName "共识调整.xlsx") {// 所有数据const exportData await getAllMainData();// 表头内容let fitstTitleList [];const secondTitleList [];allColumns.value.forEach(column > {if (!column.children) {fitstTitleL…...

深入理解JavaScript设计模式之单例模式

目录 什么是单例模式为什么需要单例模式常见应用场景包括 单例模式实现透明单例模式实现不透明单例模式用代理实现单例模式javaScript中的单例模式使用命名空间使用闭包封装私有变量 惰性单例通用的惰性单例 结语 什么是单例模式 单例模式&#xff08;Singleton Pattern&#…...

如何理解 IP 数据报中的 TTL?

目录 前言理解 前言 面试灵魂一问&#xff1a;说说对 IP 数据报中 TTL 的理解&#xff1f;我们都知道&#xff0c;IP 数据报由首部和数据两部分组成&#xff0c;首部又分为两部分&#xff1a;固定部分和可变部分&#xff0c;共占 20 字节&#xff0c;而即将讨论的 TTL 就位于首…...

SiFli 52把Imagie图片,Font字体资源放在指定位置,编译成指定img.bin和font.bin的问题

分区配置 (ptab.json) img 属性介绍&#xff1a; img 属性指定分区存放的 image 名称&#xff0c;指定的 image 名称必须是当前工程生成的 binary 。 如果 binary 有多个文件&#xff0c;则以 proj_name:binary_name 格式指定文件名&#xff0c; proj_name 为工程 名&…...

初探Service服务发现机制

1.Service简介 Service是将运行在一组Pod上的应用程序发布为网络服务的抽象方法。 主要功能&#xff1a;服务发现和负载均衡。 Service类型的包括ClusterIP类型、NodePort类型、LoadBalancer类型、ExternalName类型 2.Endpoints简介 Endpoints是一种Kubernetes资源&#xf…...

【Go语言基础【13】】函数、闭包、方法

文章目录 零、概述一、函数基础1、函数基础概念2、参数传递机制3、返回值特性3.1. 多返回值3.2. 命名返回值3.3. 错误处理 二、函数类型与高阶函数1. 函数类型定义2. 高阶函数&#xff08;函数作为参数、返回值&#xff09; 三、匿名函数与闭包1. 匿名函数&#xff08;Lambda函…...

动态 Web 开发技术入门篇

一、HTTP 协议核心 1.1 HTTP 基础 协议全称 &#xff1a;HyperText Transfer Protocol&#xff08;超文本传输协议&#xff09; 默认端口 &#xff1a;HTTP 使用 80 端口&#xff0c;HTTPS 使用 443 端口。 请求方法 &#xff1a; GET &#xff1a;用于获取资源&#xff0c;…...

计算机基础知识解析:从应用到架构的全面拆解

目录 前言 1、 计算机的应用领域&#xff1a;无处不在的数字助手 2、 计算机的进化史&#xff1a;从算盘到量子计算 3、计算机的分类&#xff1a;不止 “台式机和笔记本” 4、计算机的组件&#xff1a;硬件与软件的协同 4.1 硬件&#xff1a;五大核心部件 4.2 软件&#…...