PostgreSQL 12升级至15后pgp_pub_decrypt函数解密失败求助
解决PostgreSQL 15中pgcrypto pgp_pub_decrypt解密失败问题
可能的原因
- OpenSSL版本兼容性:PostgreSQL 15依赖的OpenSSL版本可能与12差异较大,pgcrypto底层调用OpenSSL实现加密解密,新版本OpenSSL可能默认禁用了旧算法或修改了加密逻辑,导致旧加密数据无法解密。
- pgcrypto默认参数变更:虽然pgcrypto版本同为1.3,但PostgreSQL不同版本对pgcrypto的默认参数(如加密算法、压缩模式)可能有调整,旧加密数据使用的默认参数与新版本不匹配。
- 密钥解析逻辑变化:新版本pgcrypto对PGP密钥的解析可能更严格,即使密钥内容相同,也可能因格式细节的处理差异导致解密失败。
解决方案
明确指定加密解密参数
旧代码未指定加密算法、压缩模式等参数,升级后默认值可能改变。修改加密和解密调用,明确指定与旧版本一致的参数:- 加密(示例用AES-256和zlib压缩,需根据旧环境实际配置调整):
encode(pgp_pub_encrypt(toencode, dearmor(PGPPublic), 'cipher-algo=aes256,compress-algo=zlib'), 'hex') - 解密:
pgp_pub_decrypt(decode(todecode, 'hex'), dearmor(PGPPrivate), 'banana', 'cipher-algo=aes256,compress-algo=zlib')
若不确定旧版本默认参数,可在PostgreSQL 12环境中执行以下语句获取加密详情:
SELECT pgp_pub_encrypt('test', dearmor(PGPPublic), 'info');输出结果会包含使用的算法、压缩模式等信息,直接移植到新版本的参数中即可。
- 加密(示例用AES-256和zlib压缩,需根据旧环境实际配置调整):
检查OpenSSL版本差异
在新旧服务器上执行openssl version查看版本。若差异较大,可尝试:- 临时调整OpenSSL配置,启用旧版本支持的算法(需注意安全风险)。
- 重新编译PostgreSQL 15的pgcrypto扩展,使用与旧版本相同的OpenSSL库。
测试密钥与数据兼容性
- 用新版本pgcrypto生成新的公私钥对,加密测试数据后尝试解密,验证基础功能是否正常。
- 若新密钥对正常,说明旧密钥对与新版本解析逻辑不兼容,可尝试将旧密钥重新导出为标准PGP格式,再导入使用。
确认数据完整性
再次核对新旧数据库中同一加密字段的hex值是否完全一致,排除升级过程中数据意外篡改的可能。
内容的提问来源于stack exchange,提问作者Niels
相关产品推荐
相关产品推荐

