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

PostgreSQL 数据加密和数据解密

在信息化建设和等保建设中,我们都要求实现对用户数据的隐私保护,也就是我们常说的脱敏。那么在 PostgreSQL 数据库中有没有这样的方法或者策略可以实现呢。

在 PostgreSQL 数据库中要想实现对数据的加密和解密,需要引用数据库的 pgcrypto 插件。关于 pgcrypto 具体是啥我就不仔细介绍了。有需要的可以看下

PostgreSQL 数据加密的实现
CREATE EXTENSION IF NOT EXISTS pgcrypto;

CREATE OR REPLACE FUNCTION public.encode_aes(txtstr text)
  RETURNS pg_catalog.text AS $BODY$
  DECLARE encodestr text;
  BEGIN
     SELECT encode(encrypt(txtstr::bytea, '0987654321ABHAEQ', 'aes-cbc/pad:pkcs'), 'base64') INTO encodestr;
     RETURN encodestr;
  END;
  $BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;

ALTER FUNCTION public.encode_aes(txtstr text) OWNER TO postgres;

CREATE OR REPLACE FUNCTION public.decode_aes(txtstr text)
  RETURNS pg_catalog.text AS $BODY$
  DECLARE decodestr text;
  BEGIN
    SELECT encode(decrypt(decode(txtstr,'base64'), '0987654321ABHAEQ', 'aes-cbc/pad:pkcs') , 'escape') INTO decodestr;
    RETURN decodestr;
  END;
  $BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;

ALTER FUNCTION public.decode_aes(txtstr text) OWNER TO postgres;

说明
-- 0987654321ABHAEQ:秘钥自己定义一个字符串
-- aes-cbc/pad:pkcs:加密算法
-- base64:编码格式

案例
CREATE TABLE PUBLIC.cloud_user (
    user_id INT8 NOT NULL,
    user_name VARCHAR (30),
    user_type VARCHAR (32),
    user_mobile VARCHAR (30),
    user_gender VARCHAR (5),
    logic_state VARCHAR (16) DEFAULT 0,
    create_time TIMESTAMP (6),
    user_password VARCHAR (255),
    client_id VARCHAR (64),
    user_birth TEXT,
    head_img VARCHAR (2000),
    PRIMARY KEY (user_id));
    
ALTER TABLE PUBLIC.cloud_user OWNER TO postgres;
COMMENT ON COLUMN PUBLIC.cloud_user.user_id IS '用户ID';
COMMENT ON COLUMN PUBLIC.cloud_user.user_name IS '用户姓名';
COMMENT ON COLUMN PUBLIC.cloud_user.user_type IS '用户类型';
COMMENT ON COLUMN PUBLIC.cloud_user.user_mobile IS '用户手机号';
COMMENT ON COLUMN PUBLIC.cloud_user.user_gender IS '用户性别';
COMMENT ON COLUMN PUBLIC.cloud_user.logic_state IS '逻辑状态';
COMMENT ON COLUMN PUBLIC.cloud_user.create_time IS '创建时间';
COMMENT ON COLUMN PUBLIC.cloud_user.user_password IS '用户密码';
COMMENT ON COLUMN PUBLIC.cloud_user.client_id IS '个推CID';
COMMENT ON COLUMN PUBLIC.cloud_user.user_birth IS '出生年月';
COMMENT ON COLUMN PUBLIC.cloud_user.head_img IS '头像';

INSERT INTO "public"."cloud_user" ("user_id", "user_name", "user_type", "user_mobile", "user_gender", "logic_state", "create_time", "user_password", "client_id", "user_birth", "head_img") VALUES (10000, '超级管理员', '0', 'admin', '男', '0', '2020-07-16 10:18:24', '96e79218965eb72c92a549dd5a330112', NULL, '2020-07-16', NULL);
INSERT INTO "public"."cloud_user" ("user_id", "user_name", "user_type", "user_mobile", "user_gender", "logic_state", "create_time", "user_password", "client_id", "user_birth", "head_img") VALUES (10001, '管理员', '1', '19999999998', '男', '0', '2020-07-16 10:19:01', '96e79218965eb72c92a549dd5a330112', NULL, '2020-07-16', NULL);
INSERT INTO "public"."cloud_user" ("user_id", "user_name", "user_type", "user_mobile", "user_gender", "logic_state", "create_time", "user_password", "client_id", "user_birth", "head_img") VALUES (10002, '张三', '0', '19999999996', NULL, '0', '2021-11-18 10:53:17.026', '96e79218965eb72c92a549dd5a330112', NULL, '2021-11-18', NULL);
INSERT INTO "public"."cloud_user" ("user_id", "user_name", "user_type", "user_mobile", "user_gender", "logic_state", "create_time", "user_password", "client_id", "user_birth", "head_img") VALUES (10003, '李四', '0', '19999999997', NULL, '0', '2021-11-23 09:22:43.889', NULL, NULL, '2021-11-23', NULL);
INSERT INTO "public"."cloud_user" ("user_id", "user_name", "user_type", "user_mobile", "user_gender", "logic_state", "create_time", "user_password", "client_id", "user_birth", "head_img") VALUES (10004, '王五', '1', '19999999999', '', '0', '2022-01-18 18:14:17.304', 'c4ca4238a0b923820dcc509a6f75849b', NULL, '2022-01-18', NULL);

现在对用户的出生年月进行加密
我们先创建一个字段保存当前的用户的出生年月信息,然后解密后与他进行比较,用来判断是否正确。

ALTER TABLE cloud_user ADD old_user_birth TEXT;
UPDATE cloud_user SET old_user_birth = user_birth;
SELECT encode_aes(user_birth) FROM cloud_user;
UPDATE cloud_user SET user_birth = encode_aes(user_birth);
SELECT * FROM cloud_user ORDER BY user_id;

现在对字段 user_birth 进行解密,然后将其与字段 old_user_birth 进行比较查看两者是否一致
SELECT decode_aes(user_birth),old_user_birth FROM cloud_user;


http://www.kler.cn/a/396374.html

相关文章:

  • 【计算机毕设】无查重 基于python豆瓣电影评论舆情数据可视化系统(完整系统源码+数据库+开发笔记+详细部署教程)✅
  • .NET 9 中 IFormFile 的详细使用讲解
  • flutter pigeon gomobile 插件中使用go工具类
  • Easyui ComboBox 数据加载完成之后过滤数据
  • 【route】route add命令详解
  • 什么是项目完整性管理?
  • Vue 学习随笔系列十五 -- 数组遍历方法
  • 基于VUE实现语音通话:边录边转发送语言消息、 播放pcm 音频
  • Vue.js 前端框架入门
  • Python学习从0到1 day27 Python 高阶技巧 ③ 设计模式 — 单例模式
  • Wi-Fi背后的工作原理与技术发展历程介绍【无线通信小百科】
  • 柯桥生活英语口语学习“面坨了”英语怎么表达?
  • Ubuntu联网问题处理
  • springboot的依赖实现原理:spring-boot-starter-parent解析
  • P3-3.【结构化程序设计】第三节——知识要点:while语句、do-while语句和for语句
  • 移植LVGL8.2以及移植过程的理解
  • Element表格show-overflow-tooltip属性
  • C#入门 023 什么是类(Class)
  • java 操作Mongodb
  • vue3项目【黑马大事件】笔记
  • MySQL技巧之跨服务器数据查询:基础篇-动态参数
  • c++入门--引用与指针,const与引用,NULL与nullptr
  • T6识别好莱坞明星
  • maven手动上传jar到私服仓库:mvn deploy:deploy-file命令
  • linux rsync 同步拉取上传文件
  • 【SpringBoot】使用过滤器进行XSS防御