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

Azure备份库加密PostgreSQL备份文件解密失败求助

解决Azure PostgreSQL灵活服务器长期备份解密失败问题

错误原因分析

你遇到的data greater than mod len错误,核心原因是RSA算法仅能处理小于等于密钥模数长度的数据(比如2048位RSA最多处理245字节左右),而你直接用RSA私钥解密整个database.sql备份文件——这个文件是完整的数据库备份,尺寸远大于RSA的处理上限,所以解密必然失败。

Azure PostgreSQL长期备份采用信封加密机制,实际流程是:

  1. 备份时生成一个对称加密的数据加密密钥(DEK),用DEK加密实际的备份数据(即.sql内容)
  2. 用客户管理密钥(CMK)加密这个DEK,将加密后的DEK与加密的备份数据一起存储

所以你不能直接用RSA私钥解密整个备份文件,需要先解密DEK,再用DEK解密备份内容。

解决方案

方案一:推荐使用Azure原生流程恢复(无需手动解密)

直接通过Azure门户、Azure CLI或PowerShell将Blob中的备份恢复到Azure Database for PostgreSQL - Flexible Servers,Azure会自动处理密钥解密、备份恢复的全流程,避免手动操作的复杂步骤:

  • Azure CLI示例:
    az postgres flexible-server restore \
      --name <目标服务器名> \
      --resource-group <资源组名> \
      --restore-point-in-time <备份时间点> \
      --source-server <源服务器名> \
      --long-term-retention-resource-id <备份库的LTR备份ID>
    

方案二:手动解密备份文件(仅用于特殊场景)

如果必须手动解密到本地,按以下步骤操作:

  1. 提取加密的DEK及元数据
    Azure加密的备份文件开头会封装加密后的DEK、加密算法、IV等元数据,先分离这部分数据:
    # 假设前512字节为DEK及元数据(实际长度可能因密钥规格调整)
    head -c 512 database.sql > encrypted_dek_metadata.bin
    
  2. 解密DEK
    使用备份库对应的CMK私钥(注意:是备份库的CMK,而非数据库的)解密DEK:
    openssl pkeyutl -decrypt -inkey <备份库CMK私钥文件>.pem -in encrypted_dek_metadata.bin -out dek_plaintext.key
    
    若密钥带密码保护,需添加-passin pass:<密钥密码>参数。
  3. 用DEK解密备份主体数据
    Azure通常采用AES-256-GCM加密备份内容,需从元数据中提取IV和认证标签,再执行解密:
    # 跳过DEK元数据部分,提取加密的备份主体
    tail -c +513 database.sql > encrypted_backup_data.bin
    # 用明文DEK、IV、认证标签解密(替换<IV值>和<认证标签>为实际从元数据中获取的值)
    openssl enc -d -aes-256-gcm -K $(cat dek_plaintext.key | xxd -p) -iv <IV值> -tag <认证标签> -out decrypted_database.sql
    

关键注意事项

  • 必须使用备份库对应的CMK私钥:恢复到Blob的备份是用备份库的CMK加密DEK的,而非数据库的CMK。
  • RSA密钥格式需为OpenSSL兼容的PEM格式:若你的密钥从Azure Key Vault导出,需确保是未受密码保护(或能提供密码)的PEM私钥。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 23:04:53