在视频点播和直播系统中,HLS协议凭借良好的穿透性和移动端兼容性成为主流分发方式。但当视频文件通过CDN公开分发时,内容被盗录、盗链的风险随之增加。HLS标准提供了多种加密手段,其中AES-128与SAMPLE-AES是最常见的两种。它们虽然都基于AES算法,但在加密粒度、播放器支持以及服务端配置上有着明显差异。理解这些差异,才能根据业务场景选择合适的保护方案。

AES-128与SAMPLE-AES的底层原理差异
AES-128是HLS协议中最早支持的加密方式,它在TS分片层面工作。每一个TS媒体分片在写入磁盘前,会使用标准的AES-128-CBC算法对整个分片二进制流进行加密。播放器下载到分片后,先向指定的密钥服务器请求解密密钥,再用该密钥对整块数据进行解密,还原出标准的TS包。这种方式的优势是实现极其简单,任何支持HLS的播放器都能处理,因为解密动作发生在分片读取阶段,对编码格式没有特殊要求。
SAMPLE-AES则采用了更细粒度的思路。它并不加密整个TS分片,而是只加密其中的音频样本和视频样本数据(如H.264的NAL单元负载),而TS封装头、PES头等非媒体数据保持明文。这样做的好处是部分硬件解码器可以在不解密全部数据的情况下解析容器结构,同时支持更灵活的权限控制。SAMPLE-AES通常配合encryption scheme使用,在HLS的EXT-X-KEY标签中通过METHOD=SAMPLE-AES来声明,且往往依赖Widevine或FairPlay等更完整的DRM体系。
从兼容角度看,AES-128几乎被所有开源播放器(如hls.js、ijkplayer)原生支持;SAMPLE-AES由于涉及样本级解密,往往需要播放器或系统底层提供DRM模块,在Web端通常要借助EME接口,在iOS上则直接走FairPlay。因此如果业务只做基础的防盗链而非严格的版权保护,AES-128是成本最低的方案;若涉及付费影视内容,SAMPLE-AES配合DRM才符合行业合规要求。
使用FFmpeg配置AES-128加密实战
配置AES-128加密最关键的是准备一个key info文件,里面包含密钥本身、密钥获取地址以及可选的IV。我们可以先用OpenSSL生成一个16字节的随机密钥,然后编写keyinfo.txt。FFmpeg在转封装时会读取该文件,对每个TS分片执行加密,并在生成的m3u8中写入EXT-X-KEY标签指向密钥URL。
下面是一段生成密钥并撰写key info的Shell示例,以及对应的FFmpeg命令。注意密钥URL必须可通过CDN或源站公开访问,且建议开启HTTPS防止密钥被嗅探。IV如果不指定,FFmpeg会默认使用分片序列相关的值,但显式指定有助于多CDN同步。
# 生成16字节密钥 openssl rand 16 > enc.key # 编写keyinfo.txt,格式为:密钥URI、密钥文件路径、可选IV echo "https://ipipp.com/keys/enc.key" > keyinfo.txt echo "enc.key" >> keyinfo.txt echo "0123456789ABCDEF0123456789ABCDEF" >> keyinfo.txt # 执行HLS加密转码 ffmpeg -i input.mp4 -hls_time 6 -hls_key_info_file keyinfo.txt -hls_playlist_type vod -c:v copy -c:a copy output.m3u8
上述命令中-c:v copy和-c:a copy表示不重新编码,仅做加密封装,对服务器CPU压力很小。生成的output.m3u8里会出现类似#EXT-X-KEY:METHOD=AES-128,URI="https://ipipp.com/keys/enc.key",IV=0123456789ABCDEF0123456789ABCDEF的声明。播放器读到后自动请求密钥并解密。
如果要在Nginx或CDN上保护密钥接口,应当限制Referer或加上时效Token。例如源站用PHP动态返回密钥,并校验$_GET['token']是否匹配,避免密钥被任意爬取。同时,TS分片本身虽然加密,但m3u8索引若明文暴露也给盗链者可乘之机,建议对m3u8也做鉴权。
SAMPLE-AES的服务端配置与回源策略
SAMPLE-AES在FFmpeg中的配置相对复杂,因为它通常要结合HLS的EXT-X-KEY中指定的加密方案,并依赖外部DRM服务生成许可证。以FairPlay为例,我们需要准备一个部署在ipipp.com上的许可证服务器,播放器在解密样本前先通过该服务器交换CKC。FFmpeg侧可使用-hls_enc 1配合-hls_enc_key与-hls_enc_iv,但样本级加密更多由打包工具如Shaka Packager完成。
下面用Shaka Packager命令行展示如何生成SAMPLE-AES加密的HLS。该工具会直接产出加密后的TS和对应的m3u8,其中KEY标签的METHOD为SAMPLE-AES,且包含URI指向许可证代理。注意这里的密钥并非直接下发,而是用于向DRM系统注册内容ID。
packager input=input.mp4,stream=video,output=video.mp4 input=input.mp4,stream=audio,output=audio.mp4 --hls_master_playlist_output=master.m3u8 --enable_raw_key_encryption --keys=label=:key_id=7e571d040be8a3c916c48f1a70010000:key=7e571d040be8a3c916c48f1a70010000 --clear_lead=0 --mpd_output=manifest.mpd
在CDN回源方面,SAMPLE-AES的媒体分片是样本加密的TS,回源策略和普通HLS一致,但许可证请求必须走低延迟且高可用的专用接口。建议在CDN边缘节点配置反向代理,将/fairplay/license路径回源到源站DRM服务,并开启连接复用。由于样本解密发生在播放器内核,源站无需为每个分片做特殊处理,只需保证许可证接口稳定即可。
最后对比二者运维成本:AES-128只需维护静态密钥文件和简单鉴权;SAMPLE-AES则需搭建或采购DRM许可服务,且播放端适配工作量更大。中小团队做内部培训视频分发用AES-128足够,而面向公众的影视平台应评估SAMPLE-AES加DRM的总体拥有成本,再决定技术路线。
HLS加密AES-128SAMPLE-AES修改时间:2026-08-19 00:56:17