使用GPG加密备份并验证解密

适用环境:安装GnuPG的Linux终端;示例使用手动输入口令的对称加密。适合个人管理的小规模备份,不代替企业密钥托管与自动化密钥轮换设计。

包含数据库、配置或用户资料的备份不宜裸放在公开下载目录。先完成可恢复性检查,再做加密,最后上传异地。加密口令丢失通常无法靠宝乐云找回,因此“知道如何解密、保有正确口令”也是验收内容。分段命令使用同一个Bash会话;重连后要重新设置已记录的真实路径。

准备加密对象和受控输出位置

gpg --version
umask 077
encrypted_dir=$(mktemp -d /var/tmp/baole-encrypted.XXXXXXXX)
backup_file=/var/backups/baole/run-2026-10-31/site.tar.gz
test -f "$backup_file"

backup_file 必须替换为已完成、可信的备份文件。检查加密目标空间,口令从密码管理器等独立受控位置保存。不要把口令写成 --passphrase 明文参数,也不要用 echo 把口令留在脚本、进程参数或终端历史中。

交互输入口令进行加密

gpg --no-symkey-cache --output "$encrypted_dir/site.tar.gz.gpg" --symmetric "$backup_file"
printf 'gpg encrypt exit=%s\n' "$?"
sha256sum -- "$encrypted_dir/site.tar.gz.gpg"

按GnuPG提示输入并确认足够长、与网站密码不同的口令;输入时不要截屏。只有退出码为0且生成非空加密文件后才继续,出现agent或写入错误就停止。SSH终端若无法显示口令输入界面,先运行 tty:应得到当前真实终端路径,如 /dev/pts/0;若提示 not a tty,先换用可交互的SSH终端。确认终端正常后,在当前会话设置:

GPG_TTY=$(tty)
export GPG_TTY

重新运行加密命令。若提示缺少pinentry,应由管理员按该系统的软件管理方式安装和配置口令输入程序;若容器禁止创建socket,需换到允许GnuPG正常运行的受控环境处理。不要因为已经有 .gpg 文件就忽略非零退出码,也不要把口令直接写进命令行绕过交互。

用新的目录试解密

decrypt_dir=$(mktemp -d /var/tmp/baole-decrypted.XXXXXXXX)
gpg --no-symkey-cache --output "$decrypt_dir/site.tar.gz" --decrypt "$encrypted_dir/site.tar.gz.gpg"
printf 'gpg decrypt exit=%s\n' "$?"
sha256sum -- "$backup_file" "$decrypt_dir/site.tar.gz"
gzip -t "$decrypt_dir/site.tar.gz"

完整比较两个明文文件的 SHA256,应一致;然后按原备份教程在新的恢复目录试解压。仅能查看加密文件大小,不能证明口令正确或内容能恢复。不要把试解密输出指回正式网站目录。对称加密口令可能被代理缓存,使用此处的 --no-symkey-cache 并结合独立恢复环境验证口令保管。

上传和保管时分开处理

  • 异地上传加密后的 .gpg 文件及其传输校验值;验证远端收到的加密文件完整。
  • 口令或恢复资料保存在与备份分开的受控位置,并确认授权人员在原服务器不可用时仍能取到。
  • 明确本机明文、临时解密文件的保留策略。不要因“已经加密”就任意传播;也不要在未确认异地副本可恢复前删除唯一明文。
  • 把加密工具版本、创建时间、口令保管位置的索引和试恢复结果写进内部记录,记录中不直接包含口令。

解密失败如何判断

提示或情况 优先处理
Bad session key或口令错误 确认使用的是这一个备份对应的口令,不反复猜测后覆盖源文件。
Unexpected EOF或解密中断 先比较加密文件的可信SHA256,必要时重新传输。
输出路径已存在 换一个新的恢复目录,不覆盖已经验证好的文件。
原服务器丢失 从异地取回加密文件和独立保存的恢复资料,在受控环境验证后再恢复业务。