如何在MP4文件中嵌入OpenSSL数字签名并验证其内容部分?
MP4内容签名与验证的标准流程
针对你要签名MP4核心内容而非修改元数据、且能通过OpenSSL验证的需求,有成熟的标准方案和实操流程:
1. 基于MP4标准扩展的签名方案(推荐)
利用MP4的uuid扩展box(符合ISO/IEC 14496-12标准),将签名嵌入到不影响媒体内容的专用容器中,同时保证原媒体流完整。可以借助GPAC工具集的MP4Box实现,配合OpenSSL完成签名/验证:
签名步骤
- 提取MP4的核心媒体轨道数据(过滤可变元数据,只保留不可修改的媒体内容):
mp4box -raw 1 input.mp4 -out media.raw - 用OpenSSL基于私钥对媒体内容生成签名:
openssl dgst -sha256 -sign private.key -out signature.bin media.raw - 将签名嵌入到MP4的专用
sigBox扩展容器中(不修改原媒体内容):mp4box -add input.mp4 -add signature.bin:type=sigBox input_signed.mp4
验证步骤
- 从签名后的MP4中提取签名文件和原始媒体内容:
mp4box -raw sigBox input_signed.mp4 -out signature.bin mp4box -raw 1 input_signed.mp4 -out media.raw - 用OpenSSL公钥验证签名有效性:
openssl dgst -sha256 -verify public.key -signature signature.bin media.raw
2. 轻量独立文件签名方案
如果完全不想修改MP4文件,可以将签名单独存储为独立文件,验证时重新提取相同的媒体内容进行比对:
签名步骤
- 先通过
ffprobe定位MP4中mdat媒体数据块的偏移和大小(跳过可变元数据区域):ffprobe -v quiet -show_entries format=start_time,duration -of csv=p=0 input.mp4 - 提取核心媒体数据:
# 假设mdat起始偏移为0x1000,大小为0x100000,根据实际值调整 dd if=input.mp4 of=media.raw skip=$((0x1000)) count=$((0x100000)) bs=1 - 生成签名并保存为独立文件:
openssl dgst -sha256 -sign private.key -out input.mp4.sig media.raw
验证步骤
- 重新提取相同范围的媒体数据:
dd if=input.mp4 of=media.raw skip=$((0x1000)) count=$((0x100000)) bs=1 - 用OpenSSL验证签名:
openssl dgst -sha256 -verify public.key -signature input.mp4.sig media.raw
关键注意事项
- 必须确保签名的是不可变的媒体内容,要排除MP4中可修改的元数据(如
moov中的创建时间、播放列表信息等),否则修改元数据会导致验证失败。 - 用
MP4Box添加的sigBox是MP4标准允许的扩展,不会破坏文件的播放兼容性。 - OpenSSL的验证逻辑只关注哈希值与签名的匹配,只要提取的媒体内容和签名时完全一致,就能通过验证。
内容的提问来源于stack exchange,提问作者dash-o
相关产品推荐
相关产品推荐

