【实践】视频播放成功率下降很多?可能是你密钥管理的方式不对!

简介: 一、背景 某个客户原来业务使用了mp3作为播放格式,随着业务的发展,发现优质的内容经常被成批的下载,这样对客户来说是非常严重的损失,考虑到用户的播放需求需要在web浏览器也能够正常播放,以及整体改造成本,最终选择了HLS标准加密的方案来保护用户的内容。

一、背景

某个客户原来业务使用了mp3作为播放格式,随着业务的发展,发现优质的内容经常被成批的下载,这样对客户来说是非常严重的损失,考虑到用户的播放需求需要在web浏览器也能够正常播放,以及整体改造成本,最终选择了HLS标准加密的方案来保护用户的内容。

接入加密播放以后,发现一个较严重的问题,客户端的播放成功率下降非常多,经过多方排查发现,这是因为特殊字符引发的一个问题。在解密播放的时候我们通过EXT-X-KEY中的URI无法正常获取到解密的KEY,后者是拿到的KEY不对。所以初步怀疑是业务服务器对密钥管理有问题。

本篇文章是由阿里云视频云高级技术专家王海华撰写,来记录本次问题的排查、解决方案与后续避免措施。

二、分析排查

通过跟客户业务服务器联调发现:播放器发起如下请求:

https://api.xxxxx.com/hls/key/dk?MediaId=84a841f61d0d426d8c2058fa72813caa&Ciphertext=YjlhYmQwM2UtMzMxMi00NTgzLWEzMTQtN2M4ZTAwMjk1ZWUyYVVibnZiTW95QnQzTWJGM1pSK29VVnRlYmNsWEU4aUlBQUFBQUFBQUFBRFhrdE40aUFjUXUxTHptR3V0bTAzVzArVHdGR2pJbU00d0tOSkZmMUtEU080aCtHakhHa1BQ&MtsHlsUriToken=IDXBq4HcS6VGUIh4iyUk3R2QnlGMS2MnWukBTqGhC+oZxdeieVrAHVUU+iwHN1kN

返回的是请求非法,根据业务方判断是MtsHlsUriToken的值不对!

打印了业务服务端获取到和url请求之前的各自的MtsHlsUriToken参数值发现:

IDXBq4HcS6VGUIh4iyUk3R2QnlGMS2MnWukBTqGhC oZxdeieVrAHVUU iwHN1kN

并非是之前下发的

IDXBq4HcS6VGUIh4iyUk3R2QnlGMS2MnWukBTqGhC+oZxdeieVrAHVUU+iwHN1kN

对比发现非常明显,url里面参数的特殊字符被转义给弄丢失了。跟客户沟通下来发现用户的业务服务环境是:spring boot 2.0 ,web容器是Tomcat。通过查阅资料和Tomcat的源码发现Tomcat默认会对URL的参数进行URLDecode导致了url里面的特殊字符被转义给丢失了,产生了一开始的问题。

整个问题排查过程还是比较简单的,但是从我们这个场景里面涉及到的交互非常多,很多环节都需要客户进行参与,我们如何能保证后续不出现这一类问题呢?我们可以从整个全链路的流程上来梳理一下。先看看整个HLS安全播放的整体业务流程。

三、安全播放之HLS标准加密

为了了解整件事情过程我们先了解一下整个HLS标准加密业务架构,业务流程和一些技术细节。

1. HLS标准加密之加密(转码生产流程)

先看一下我们如何得到一个加密的视频的。时序图如下:
image

名词解释

  1. 业务服务器:由客户开发,主要用户出发转码任务和接收回调(播放地址)
  2. MPS转码服务:进行转码加密;
  3. KMS:密钥管理服务;
  4. DK:秘钥明文(用户加密转码和解密播放的真正密文);
  5. EDK:秘钥密文(经过加密的DK);

关键步骤说明:

  1. 通过MediaId 从KMS生成秘钥(DK和EDK),后续可以通过EDK和MediaId重新从KMS中获取DK;
  2. 生成m3u8的时候在文件中加入:#EXT-X-KEY:METHOD=AES-128,并在URI=中添加MediaId + Ciphertext两个参数,后续业务服务器可以通过这两个参数中重新获得DK;
    经过以上的步骤,加密后的视频(m3u8文件 和 加密后的ts文件)已经在OSS中了;

2. HLS标准加密之解密(解密播放流程)

要对视频进行解密播放有以下几个关键步骤:

  1. 拿到播放地址;
  2. 拿到秘钥;
  3. 解密播放;
    同样我们也看看整个播放环节的业务流程和一些技术细节。

时序图如下:
image

关键步骤说明:

  1. 标准加密视频播放的时候需要业务服务器保护和颁发解密秘钥,获取播放地址的时候用户业务服务器需要判断请求是否合法,比如是否是登录用户等;
  2. 播放地址加上一个参数:MtsHlsUriToken,该参数有业务服务器生成,该主要用于后续获取解密key的时候进行合法认证;
  3. 标准加密场景中,m3u8中会添加扩展字段:#EXT-X-KEY:METHOD=AES-128,URI=,其中的URI一般都是指的是业务服务器,用来认证请求合法性和返回秘钥key;
  4. CDN业务中会自动修改m3u8的文件,把MtsHlsUriToken参数直接拼接在#EXT-X-KEY:METHOD=AES-128,URI= 之后;
  5. 播放器拿到 EXT-X-KEY-URI 后请求对应的服务器并拿到key;
  6. 播放器用这个key解密后续的ts文件进行播放;
  7. 建议:DK可以根据MediaId进行本地缓存,没有必要每次都从KMS中去获取;

四、后面如何避免?

  1. 建议MtsHlsUriToken参数值不要带URL的特殊字符;
  2. 如果用户无法避免MtsHlsUriToken重带有特殊字符则需要对MtsHlsUriToken参数值进行UrlEncode,我们的播放器逻辑和CDN逻辑不对参数做任何的修改;
  3. 需要让客户在对接的时候关注Web容器对URL的Decode处理;

五、附录衍生知识

1.form的enctype属性为编码方式,常用有两种:application/x-www-form-urlencoded和multipart/form-data,默认为application/x-www-form-urlencoded。

image

2.如何对Url中的非法字符进行编码:

Url编码通常也被称为百分号编码(Url Encoding,also known as percent-encoding),是因为它的编码方式非常简单,使用%百分号加上两位的字符——0123456789ABCDEF——代表一个字节的十六进制形式。Url编码默认使用的字符集是US-ASCII。

例如a在US-ASCII码中对应的字节是0x61,那么Url编码之后得到的就是%61,我们在地址栏上输入http://g.cn/search?q=%61%62%63,实际上就等同于在google上搜索abc了。又如@符号在ASCII字符集中对应的字节为0x40,经过Url编码之后得到的是%40。

对于非ASCII字符,需要使用ASCII字符集的超集进行编码得到相应的字节,然后对每个字节执行百分号编码。对于Unicode字 符,RFC文档建议使用utf-8对其进行编码得到相应的字节,然后对每个字节执行百分号编码。如"中文"使用UTF-8字符集得到的字节为0xE4 0xB8 0xAD 0xE6 0x96 0x87,经过Url编码之后得到"%E4%B8%AD%E6%96%87"。

如果某个字节对应着ASCII字符集中的某个非保留字符,则此字节无需使用百分号表示。例如"Url编码",使用UTF-8编码得到的字节是 0x55 0x72 0x6C 0xE7 0xBC 0x96 0xE7 0xA0 0x81,由于前三个字节对应着ASCII中的非保留字符"Url",因此这三个字节可以用非保留字符"Url"表示。最终的Url编码可以简化 成"Url%E7%BC%96%E7%A0%81" ,当然,如果你用"%55%72%6C%E7%BC%96%E7%A0%81"也是可以的。

12月20日杭州站【云栖TechDay-音视频技术实战沙龙】,多位视频云专家现场解读短视频、直播、视频AI、视频加速技术实践,点击了解活动详情及免费报名

目录
相关文章
|
5月前
|
缓存 UED
【计算巢】移动网络优化技巧:提升用户体验的关键
【6月更文挑战第1天】在数字化时代,移动网络已成为生活必需,但网络问题时常影响用户体验。本文探讨了移动网络优化技巧,包括理解网络基本原理、增强信号强度、避免网络拥堵及示例代码演示如何监听和管理网络状态。通过这些方法,可以提升网络效率和稳定性,优化用户体验。
111 2
【计算巢】移动网络优化技巧:提升用户体验的关键
|
存储 缓存 容灾
带你读《多媒体行业质量成本优化及容灾方案白皮书》3. 回源成本优化(1)
带你读《多媒体行业质量成本优化及容灾方案白皮书》3. 回源成本优化(1)
447 0
|
缓存 容灾 调度
带你读《多媒体行业质量成本优化及容灾方案白皮书》3. 回源成本优化(2)
带你读《多媒体行业质量成本优化及容灾方案白皮书》3. 回源成本优化(2)
469 0
|
编解码 缓存 容灾
带你读《多媒体行业质量成本优化及容灾方案白皮书》2. CDN及直播出流量优化方案
带你读《多媒体行业质量成本优化及容灾方案白皮书》2. CDN及直播出流量优化方案
352 0
|
负载均衡
LOOK!直播APP源码平台的稳定控制方法
我就把简单两步控制直播APP源码平台的稳定的方法分享给大家了,开发直播APP源码平台优质知识分享,大家有什么不懂的或是想要开发直播APP源码平台可以问我
LOOK!直播APP源码平台的稳定控制方法
|
存储 缓存 Dart
如何处理直播实时在线人数显示并且最小化性能和资源消耗?
直播技术成为一种极为流行的交流方式。而直播平台的核心指标之一就是实时在线人数,准确地显示该指标对于用户和运营商来说都具有重要意义。然而,直播实时在线人数的显示也面临着性能和资源消耗的挑战。本文将介绍如何利用Flutter和Dart开发技术栈来优化直播实时在线人数的显示,以达到最小化性能和资源消耗的目标。 作者:狗头大军之江苏分军 链接:https://juejin.cn/spost/7255473856234913852 来源:稀土掘金 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
如何处理直播实时在线人数显示并且最小化性能和资源消耗?
EMQ
|
存储 JSON 监控
MQTT X 1.9.1 发布:资源消耗降低 80%,稳定性大幅提升
MQTT 5.0客户端工具MQTT X 1.9.1稳定版本正式发布,CPU资源消耗与内存占用减少80%,整体性能大幅优化。
EMQ
204 0
MQTT X 1.9.1 发布:资源消耗降低 80%,稳定性大幅提升
|
编解码 缓存 移动开发
一文读懂云渲染“串流”全链路时延及优化策略
这是一个让云游戏完美起步的时代。
1746 0
一文读懂云渲染“串流”全链路时延及优化策略
|
机器学习/深度学习 存储 弹性计算
冷启动优化:开发者侧降低冷启动影响的方案
冷启动优化:开发者侧降低冷启动影响的方案
14463 0
|
编解码 缓存 自然语言处理
以“用户播放行为与体验”为核心的视频服务质量优化
如何应对视频直播中复杂多样的用户网络环境,提高视频服务质量是各直播服务平台面临的一大难题。Twitch提出了一种无监督学习的方法,全面评估用户观看时的行为与体验,预测用户的网络状况,通过码率自适应的方法实现快速的迭代升级从而提高服务质量。本文来自Twitch Principal Research Engineer沈悦时在LiveVideoStackCon 2018中的分享,并由LiveVideoStack整理而成。
487 0
以“用户播放行为与体验”为核心的视频服务质量优化