You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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密钥的解析可能更严格,即使密钥内容相同,也可能因格式细节的处理差异导致解密失败。

解决方案

  1. 明确指定加密解密参数
    旧代码未指定加密算法、压缩模式等参数,升级后默认值可能改变。修改加密和解密调用,明确指定与旧版本一致的参数:

    • 加密(示例用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');
    

    输出结果会包含使用的算法、压缩模式等信息,直接移植到新版本的参数中即可。

  2. 检查OpenSSL版本差异
    在新旧服务器上执行openssl version查看版本。若差异较大,可尝试:

    • 临时调整OpenSSL配置,启用旧版本支持的算法(需注意安全风险)。
    • 重新编译PostgreSQL 15的pgcrypto扩展,使用与旧版本相同的OpenSSL库。
  3. 测试密钥与数据兼容性

    • 用新版本pgcrypto生成新的公私钥对,加密测试数据后尝试解密,验证基础功能是否正常。
    • 若新密钥对正常,说明旧密钥对与新版本解析逻辑不兼容,可尝试将旧密钥重新导出为标准PGP格式,再导入使用。
  4. 确认数据完整性
    再次核对新旧数据库中同一加密字段的hex值是否完全一致,排除升级过程中数据意外篡改的可能。

内容的提问来源于stack exchange,提问作者Niels

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 00:05:16