Linux下用数字签名验证二进制文件完整性:ELF签名实战脚本详解
数字签名核心要件
数据可被拦截篡改,接收文件真实性至关重要。用户A通过邮件发送二进制文件给用户B,B如何确信文件未被篡改?数字签名(DS)通过将数据绑定发送者唯一凭证提供可靠方案。
- 签名必须源自被签名消息
- 须包含发送者唯一信息
- 创建简易
- 计算上不可伪造
- 签名尺寸小

64位ELF二进制签名实战实现
采用直接签名方案(无第三方仲裁),私钥签名、公钥证书验证。流程:
- 生成源二进制MD5哈希
- 创建私钥与自签名公钥证书
- 签名二进制:
- 用私钥加密MD5哈希
- 将加密哈希存入ELF新
.sig段 - 证书存入
~/.ssh备后续验证
全流程可用openssl、objcopy、md5sum脚本化。下附自动化签名ELF脚本sign_elf.sh(文末附无行号源码)。
#!/bin/bash
KEY_DIR="$HOME/.ssh"
PRIVATE_KEY="$KEY_DIR/priv.key"
CERTIFICATE="$KEY_DIR/pub.crt"
SUBJECT="/C=RU/ST=Nizhni Novgorod/L=Nizhniy Novgorod/O=Auriga/OU=DEV/CN=www.auriga.com"
if [ "$#" = "0" ]; then echo "Usage: sign_elfs.sh [ELF files]"; exit 1; fi
[ ! -d "$KEY_DIR" ] && mkdir "$KEY_DIR"
# 生成私钥与证书
openssl req -nodes -x509 -sha256 -newkey rsa:4096 -keyout "$PRIVATE_KEY" -out "$CERTIFICATE" -days 365 -subj "$SUBJECT"
for ELF_BIN in "$@"; do
ELF_BASE_NAME="${ELF_BIN##*/}"
ELF_BIN_SIGNATURE="$ELF_BASE_NAME.sha256"
ELF_BIN_MD5="$ELF_BASE_NAME.md5"
if [ ! -f "$ELF_BIN" ]; then echo "Error: no such file $ELF_BIN"; exit 103; fi
# 移除旧.sig段
objcopy --remove-section=.sig "$ELF_BIN"
# 添加512字节零填充.sig段
rm -f dummy.txt && touch dummy.txt && truncate --size=512 dummy.txt
objcopy --add-section .sig=dummy.txt --set-section-flags .sig=noload,readonly "$ELF_BIN"
# 计算含.sig段的MD5
md5sum "$ELF_BIN" | awk '{ print $1 }' > "$KEY_DIR/$ELF_BIN_MD5"
# 私钥签名MD5哈希
openssl dgst -sha256 -sign "$PRIVATE_KEY" -out "$KEY_DIR/$ELF_BIN_SIGNATURE" "$KEY_DIR/$ELF_BIN_MD5"
# 可选即时验证
openssl dgst -sha256 -verify <(openssl x509 -in "$CERTIFICATE" -pubkey -noout) -signature "$KEY_DIR/$ELF_BIN_SIGNATURE" "$KEY_DIR/$ELF_BIN_MD5"
# 嵌入加密哈希到.sig段
objcopy --update-section .sig="$KEY_DIR/$ELF_BIN_SIGNATURE" --set-section-flags .sig=noload,readonly "$ELF_BIN"
# 显示.sig段内容供检查
objdump -sj .sig "$ELF_BIN"
done
rm -f dummy.txt
ls -ls ~/.ssh
脚本关键步骤解析
第19行:证书生成
openssl req -nodes -x509 -sha256 -newkey rsa:4096 -keyout "$PRIVATE_KEY" -out "$CERTIFICATE" -days 365 -subj "$SUBJECT"
req创建证书签名请求-nodes输出明文私钥-x509自签名证书-sha256选SHA-256哈希-newkey rsa:4096生成4096位RSA密钥SUBJECT遵循RFC 5280格式
生成~/.ssh/priv.key(私钥)与~/.ssh/pub.crt(证书含公钥)。
循环处理每个ELF文件(第21行起)
移除旧.sig段,添加512字节占位段,计算MD5,私钥签名,可选验证,嵌入签名替换占位,完成签名ELF。
接收方可提取.sig段,用公钥证书解密,比对重新计算的文件哈希,验证完整性。
物联网技术