md5校验需确保相同编码和换行环境,校验文件须为unix换行(\n),且md5sum仅防意外损坏,不防恶意篡改,生产环境应使用sha256sum或gpg签名。

md5sum 生成和比对必须在相同编码和换行环境下进行
Linux 下 md5sum 默认按字节计算哈希,但文件内容若含 Windows 风格换行(\r\n)或 BOM 头,会导致校验值不一致——哪怕代码逻辑完全一样。常见于从 Windows 编辑器打包、Git 未配置 core.autocrlf=false 或 tar 包内嵌文本文件被意外转换。
- 传输前在源机运行:
md5sum myapp-v1.2.tar.gz > myapp-v1.2.tar.gz.md5 - 目标机接收后先确认文件未被修改:
file myapp-v1.2.tar.gz应显示gzip compressed data,而非UTF-8 Unicode text等异常类型 - 若校验失败,用
dos2unix -n myapp-v1.2.tar.gz /dev/stdout | md5sum快速验证是否因换行符污染导致差异(仅用于诊断,不建议直接修复二进制包)
校验时别漏掉 -c 参数的静默模式陷阱
md5sum -c 是比对标准方式,但它默认输出所有成功项(每行一个 OK),当包很大、日志被截断或管道后续命令依赖退出码时,容易误判。它的退出状态才是唯一可信依据:0 表示全部通过,1 表示至少一个失败,2 表示读取校验文件出错。
- 正确用法:
md5sum -c myapp-v1.2.tar.gz.md5 >/dev/null && echo "intact" || echo "corrupted" - 避免写成:
md5sum -c myapp-v1.2.tar.gz.md5 | grep OK—— 成功时输出多行,失败时可能仍输出部分OK并混杂FAILED,grep 无法可靠判断整体结果 - 校验文件本身必须是 Unix 换行(
\n),可用head -1 myapp-v1.2.tar.gz.md5 | od -c查看末尾是否为\n而非\r \n
不要把 md5sum 当作安全完整性保障
MD5 已被证实存在碰撞漏洞,攻击者可构造不同内容产生相同哈希值。它只适合防意外损坏(如网络丢包、磁盘坏道、scp 中断),不能防恶意篡改。生产环境分发代码包应优先使用 sha256sum 或签名机制。
- 生成强校验值:
sha256sum myapp-v1.2.tar.gz > myapp-v1.2.tar.gz.sha256 - 比对方式与
md5sum -c完全一致,只需替换命令名 - 若需信任链,用
gpg --detach-sign myapp-v1.2.tar.gz.sha256配合公钥验证,此时md5sum连辅助角色都不再合适
自动化脚本里注意路径和空格处理
当把 md5sum 写进部署脚本,文件名含空格或路径含变量时,不加引号会导致校验对象错误——md5sum $pkg 在 $pkg="my app.tar.gz" 时实际执行的是 md5sum my app.tar.gz,即校验两个文件。
- 始终引用变量:
md5sum "$pkg"和md5sum -c "$pkg.md5" - 校验文件名必须与原始包严格对应,
md5sum不会自动补后缀;若手动重命名过包,务必同步更新 .md5 文件首行中的文件名字段 - 在 CI/CD 流水线中,建议用绝对路径生成和比对,避免工作目录切换引发路径解析偏差
md5sum -c 的退出码是否可信。











