密码明明一样,为什么 GPG 说“错的“?

背景 服务器上用 GPG 加密了一个备份包,密码存在 /root/.backup_pass。想在 Windows 上验证能不能解密,结果:

bash 复制代码
gpg --passphrase-file backup_pass.txt --decrypt secrets.tar.gz.gpg
# gpg: decryption failed: Bad session key

密码是从服务器抄过来的,一个字符没差。

原因 用显微镜看两个文件的字节:

服务器端(Linux):

bash 复制代码
xxd /root/.backup_pass | tail -2
# ... 3D 0A     ← 结尾是 "=" + 换行(LF)

Windows 端:

shell 复制代码
Format-Hex backup_pass.txt
# ... 3D 0D 0A  ← 结尾是 "=" + 回车 + 换行(CRLF)

多了一个 0D(回车)。

Windows 的 Set-Content 默认在每行末尾加 \r\n,GPG 把那个 \r 也当成密码的一部分了。

解决 用不自动加 CRLF 的写入方式:

bash 复制代码
# ❌ 会加 CRLF
"PASSWORD" | Set-Content backup_pass.txt

# ✅ 一字不差
[System.IO.File]::WriteAllText("$HOME\backup_pass.txt", "PASSWORD")

Linux 端写密码文件时,也养成习惯:

bash 复制代码
# ❌ echo 会自动加 \n
echo "PASSWORD" > /root/.backup_pass

# ✅ -n 不加换行
echo -n "PASSWORD" > /root/.backup_pass

验证效果

bash 复制代码
Format-Hex backup_pass.txt
# 结尾应该只有 3D,没有 0D 0A

再解密:

bash 复制代码
gpg --passphrase-file backup_pass.txt --decrypt secrets.tar.gz.gpg
# gpg: AES256.CFB encrypted data
# gpg: encrypted with 1 passphrase
# → 成功

三个坑 坑 1:肉眼看不出的差异 记事本里两个文件长得一模一样,只有看字节才知道差一个 \r。跨平台处理密钥文件,永远用 Format-Hex / xxd 确认。

坑 2:Linux 的 echo 也会加换行 不只是 Windows 有坑。Linux 写密码文件记得用 echo -n。

坑 3:密码管理器里存的值可能带换行 从密码管理器复制时,有的会带上末尾换行。写入文件后记得清一下。

相关推荐
七牛云行业应用13 小时前
Muse Spark Open 发布:Meta 称其为美国最强开放权重模型,816B 参数如何落地
算法
小蒜学长13 小时前
基于Springboot+Vue的高校教师教学业绩综合管理系统的设计与开发(代码+数据库+LW)
java·数据库·spring boot·后端·教学业绩管理·三级权限
熊哈哈O_o14 小时前
千亿级时序数据:存储压缩、高速写入与时序超表技术
后端
Mikko714 小时前
Spring Boot 3.5.16 自带的 Tomcat 10.1.55 中了哪些 CVE?其中一条是修上一个漏洞时带进来的
java·spring boot·后端·安全·tomcat
海宇大数据14 小时前
零信任架构实战:基于海宇公安二要素认证即时版构建自动化证券账户实名鉴权网关
人工智能·架构·自动化·区块链
站大爷IP14 小时前
Python的字符串查找把我坑惨了,原来find和index的区别这么大
后端
sp4214 小时前
一个支持 Java 8 的 MCP SDK(支持最新 2026-07-28 协议)
后端·mcp
Gopher_HBo14 小时前
HTTP2传输层与流控
后端
Bazingga14 小时前
同一个脑子,不同的身体:桌面办公智能体全景拆解
后端
esop轻Mes看板亮灯分拣ESD静电安14 小时前
产线“最后一米”的破局密码:ESOP与MES的区别与深度协同
算法