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

PostgreSQL的扩展 pgcrypto

PostgreSQL的扩展 pgcrypto

pgcrypto 是 PostgreSQL 提供的加密扩展,包含各种加密函数、哈希函数和随机数生成器,是数据库级加密的重要工具。

一、安装与启用

-- 安装扩展
CREATE EXTENSION pgcrypto;-- 验证安装
SELECT * FROM pg_extension WHERE extname = 'pgcrypto';

二、核心功能分类

1. 哈希函数

函数描述示例
digest()计算二进制哈希SELECT digest('data', 'sha256');
hmac()带密钥的哈希SELECT hmac('data', 'key', 'sha256');
crypt()密码哈希(适合存储密码)SELECT crypt('password', gen_salt('bf', 8));

密码存储最佳实践

-- 存储密码
INSERT INTO users (username, password) 
VALUES ('user1', crypt('mypassword', gen_salt('bf')));-- 验证密码
SELECT (password = crypt('entered_password', password)) AS auth 
FROM users WHERE username = 'user1';

2. 加密/解密函数

对称加密
-- AES加密(需PG10+)
SELECT encode(encrypt(convert_to('secret data', 'utf8'), 'myencryptionkey', 'aes-cbc/pad:pkcs'
), 'base64');-- 解密
SELECT convert_from(decrypt(decode('...base64...', 'base64'),'myencryptionkey','aes-cbc/pad:pkcs'
), 'utf8');
支持的加密算法
  • aes-cbc/pad:pkcs
  • aes-ecb/pad:pkcs
  • bf-cbc/pad:pkcs (Blowfish)
  • des-cbc/pad:pkcs

3. 随机数据生成

函数描述
gen_random_bytes()生成加密安全的随机字节
gen_random_uuid()生成随机UUID(v4)
gen_salt()生成密码哈希用的随机盐

示例

-- 生成随机token(32字节)
SELECT encode(gen_random_bytes(32), 'hex');-- 生成UUID
SELECT gen_random_uuid();

三、高级用法

1. 列级加密

-- 创建加密列的表
CREATE TABLE secure_data (id serial PRIMARY KEY,plain_text text,encrypted_text bytea
);-- 插入加密数据
INSERT INTO secure_data (plain_text, encrypted_text)
VALUES ('sensitive info',encrypt(convert_to('sensitive info', 'utf8'), 'mykey123', 'aes-cbc'
);-- 查询解密数据
SELECT id, plain_text,convert_from(decrypt(encrypted_text, 'mykey123', 'aes-cbc'), 'utf8') AS decrypted
FROM secure_data;

2. 密钥管理方案

方案1:应用层提供密钥

-- 使用参数化查询传递密钥
PREPARE decrypt_data(text) AS
SELECT convert_from(decrypt(encrypted_data, $1, 'aes-cbc'), 'utf8')
FROM secure_table;

方案2:使用pgcrypto+环境变量

-- 通过外部配置获取密钥
CREATE OR REPLACE FUNCTION get_encryption_key() RETURNS text AS $$SELECT current_setting('app.encryption_key');
$$ LANGUAGE sql;

四、性能与安全考虑

1. 性能影响

  • 加密/解密操作会增加CPU开销
  • 加密数据无法使用常规索引
  • 建议只加密真正敏感的数据

2. 安全最佳实践

  1. 密钥管理:不要将加密密钥存储在数据库中
  2. 算法选择:优先使用AES-256等现代算法
  3. 盐值使用:密码哈希必须使用随机盐
  4. 传输安全:确保应用与数据库的连接加密(SSL)

五、与其他扩展的集成

1. 与pg_partman结合

-- 创建加密的分区表
CREATE TABLE encrypted_logs (log_id bigserial,log_data bytea,created_at timestamptz
) PARTITION BY RANGE (created_at);-- 添加加密分区
CREATE TABLE encrypted_logs_2023 PARTITION OF encrypted_logs
FOR VALUES FROM ('2023-01-01') TO ('2024-01-01');

2. 与PostGIS结合

-- 存储加密的地理位置数据
CREATE TABLE secure_locations (id uuid PRIMARY KEY DEFAULT gen_random_uuid(),encrypted_coords bytea,public_name text
);-- 插入时加密坐标
INSERT INTO secure_locations (encrypted_coords, public_name)
VALUES (encrypt(convert_to(ST_AsBinary(ST_Point(-71.104, 42.315)), 'utf8'),'mykey123','aes-cbc'
),

六、故障排查

常见错误处理

  1. 解密失败

    -- 检查加密密钥和算法是否匹配
    SELECT decrypt(encrypted_data, 'wrongkey', 'aes-cbc'); -- 会报错
    
  2. 编码问题

    -- 确保编解码方式一致
    SELECT convert_from(decrypt(decode(encode(encrypt_data, 'base64'), 'base64'),'mykey', 'aes-cbc'
    ), 'utf8');
    
  3. 权限问题

    -- 确保角色有权限使用pgcrypto
    GRANT EXECUTE ON ALL FUNCTIONS IN SCHEMA public TO app_user;
    

pgcrypto为PostgreSQL提供了强大的加密能力,合理使用可以显著提升数据安全性,但需要注意密钥管理和性能影响。

http://www.xdnf.cn/news/2321.html

相关文章:

  • 全场景婴幼儿托育服务与管理实训室建设方案
  • 鸿蒙版电影app设计开发
  • 【Quest开发】透视环境下抠出身体并能遮挡身体上的服装
  • 【前端基础】viewport 元标签的详细参数解析与实战指南
  • Milvus(8):密集向量、二进制向量、稀疏向量
  • 烽火HG680-MC_晨星MSO9385芯片-2+8G_安卓9.0_不分地区通刷卡刷固件包
  • Java面向对象:抽象类详解
  • Linux文件操作
  • 如何避免爬虫因Cookie过期导致登录失效
  • 视觉/深度学习/机器学习相关面经总结(2)(持续更新)
  • vscode vue 的插件点击组件不能跳转到文件问题解决
  • LeetCode13_罗马数字转整数
  • OpenVLA:大语言模型用于机器人操控的经典开源作品
  • 界面打印和重定向同时实现
  • 多级缓存架构设计与实践经验
  • 决策树随机深林
  • Mysql从入门到精通day6————时间和日期函数精讲
  • PDF嵌入隐藏的文字
  • [ACTF2020 新生赛]Upload
  • DeepSeek智能时空数据分析(五):基于区域人口数量绘制地图散点-大模型搜集数据NL2SQL加工数据
  • Python对比两张CAD图并标记差异的解决方案
  • 第5章 数据库系统(选择|案例|论文)(重点★★★★★)
  • 【ROS2】ROS开发环境配置——vscode和git
  • 【极致版】华为云Astro轻应用抽取IoTDA影子设备参数生成表格页面全流程
  • OceanBase数据库磁盘空间管理
  • AI声像融合守护幼儿安全——打骂/异常声音报警系统的智慧防护
  • 在Linux中使用ferror()函数和feof()函数判断文件是否读取成功,或者读取指针是否到达了文件末尾?
  • python实战项目66:抓取考研招生专业信息
  • 2025上海车展 | 移远通信重磅发布AR脚踢毫米波雷达,重新定义“无接触交互”尾门
  • IO与文件·I(linux+C)