You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 15:24:54