带加密的HTTP直播流传输

19

我正在尝试理解苹果在其iOS设备以及Safari上支持的HTTP Live Streaming协议如何保护解锁内容的关键。

据我了解,.m3u8文件将所有内容集成在一起,并引用内容(MPEG2 TS容器,AES 128加密)和TS文件的密钥。

就像这个示例:

   #EXTM3U
   #EXT-X-MEDIA-SEQUENCE:7794
   #EXT-X-TARGETDURATION:15

   #EXT-X-KEY:METHOD=AES-128,URI="https://priv.example.com/key.php?r=52"

   #EXTINF:15,
   http://media.example.com/fileSequence52-1.ts
   #EXTINF:15,
   http://media.example.com/fileSequence52-2.ts
   #EXTINF:15,
   http://media.example.com/fileSequence52-3.ts

   #EXT-X-KEY:METHOD=AES-128,URI="https://priv.example.com/key.php?r=53"

   #EXTINF:15,
   http://media.example.com/fileSequence53-1.ts
假定使用基于浏览器的播放,其中在“src”属性中输入m3u8文件到<video>元素中。即使密钥通过https传递,如何确保用户不会简单地在浏览器中输入https URL并将密钥保存到硬盘?据我所知,<video>标签在使用浏览器的https堆栈播放m3u8源时进行密钥下载——如何区分浏览器内部的合法客户端和只是在地址栏中键入它的用户?这一点一定很明显,但我就是看不明白... 最好的祝愿,dansch

1
非常好的问题,特别是在大多数情况下,HTTPS只是一个基于服务器信任的实现,而不是客户端信任。在广泛的网络上,这是可以理解的,因为用户数据被传递到服务器而不是相反。因此,用户需要确保他们将自己的数据发送到可信站点。然而,在视频的情况下,内容基本上是免费提供的,服务器需要比用户更加信任。但是,客户端身份验证并不可行,因为需要服务成千上万的用户。最终,我只是陷入了困境。 - Dev Kanchen
7个回答

3
这里有一些有趣的指针: https://developer.apple.com/library/content/documentation/AudioVideo/Conceptual/AirPlayGuide/EncryptionandAuthentication/EncryptionandAuthentication.html。这需要在iOS中进行自定义工作,还需要在Android和Web播放器中进行自定义工作。以下是一些技术指南:
  • 从受保护的HTTPS域中提供密钥。在播放开始之前,您的应用程序可以使用NSURLConnection验证自身,并提供保持隐藏的凭据。
  • 使用HTTPS上的cookie。您的应用程序可以连接到HTTPS服务器并以应用程序定义的方式进行认证。您的服务器可以发出适用于密钥URL的cookie。您应该将cookie设置为在播放完成后很长时间过期。然后,服务器必须要求未来GET请求中存在有效的会话cookie。 为了最大程度地提高可靠性,如果过期日期即将到来,服务器应更新cookie过期日期以响应未来的GET请求。
  • 使用应用程序定义的URL方案在.m3u8文件中指定密钥。应用程序应注册一个自定义NSURLProtocol来处理这些URL的请求。播放器随后在需要加载密钥URL时回调您的应用程序; 您的应用程序可以使用安全的边缘通道获取密钥,并将其提供给播放器。

如果您只针对iOS,则应使用Apple的Fairplay DRM来处理密钥的认证。


3
如何确保用户不会简单地在浏览器中输入https URL并将密钥保存到硬盘上呢?
您可以在应用程序中拥有SSL客户端密钥/证书,从而验证“应用程序”以播放内容。然后就可以避免将内容泄漏给除您的应用程序之外的其他设备。
但这意味着您需要在应用程序内部以某种方式隐藏您的SSL密钥/密码。而且,不幸的是,在iOS上让视频播放器使用SSL密钥身份验证也存在问题...

2
答案并不明显。如果想要确保安全,您需要发明自己的密钥交付方式。一种选择是为授权用户设置 cookie,并在密钥服务器中验证 cookie。这将防止某人仅使用密钥 URL 来绕过您的安全性。
请记住,只需要一个合法客户端泄露密钥,就会使您的安全性失效。

作为后续措施,苹果公司为最新的几款iOS设备引入了安全密钥交付机制。他们称之为FairPlay Streaming。您可以在苹果公司的网站上阅读相关信息:https://developer.apple.com/streaming/fps/ - vipw

2

最好的方式是使用苹果HLS支持的加密方式。HLS支持128位AES加密,客户端播放器需要解码流。


1

1
这个问题特别询问加密方面的内容,而FAQ#16说:“媒体可以加密,并且可以通过在客户端从您的HTTPS服务器检索密钥时要求身份验证来限制密钥访问。” 这个答案完全没有回答问题的关键点。 - Tom Dalling

1
“如何区分浏览器内的合法客户端和用户在地址栏中输入的客户端?” 有趣的区分,建议是当用户在网页中播放嵌入式视频时,他们使用的浏览器是合法的,而通过地址栏访问时则是非法的。 但实际上并没有区别,我认为您没有漏掉任何内容。 如何给浏览器权限而不给用户?难道用户不能自己编写浏览器吗? 我知道,似乎很少有用户编写浏览器,但这些类型的讨论总是关于不太可能的情况。一个不太可能的用户可能会以纯文本形式查看m3u8文件,他们可能直接下载密钥,他们可能使用这些密钥来解密并最终拼接视频片段。 或者更有可能的是,使用屏幕录制软件复制他们可以在浏览器中播放的任何视频。 在我看来,如果用户被授权播放视频,则可以不幸地复制该视频 - 因为没有办法阻止视频显示被重定向为不再加密的内容 - 至少在桌面计算机在浏览器中播放视频的环境中是如此。

总之,我的理解是,您可以通过要求授权来保护密钥以获取密钥,但是如果用户拥有该授权,则可以获取这些密钥。


1

请看这里 https://datatracker.ietf.org/doc/html/draft-pantos-http-live-streaming-13#section-6.3.6

播放列表需要为每个片段指定一个密钥标签,以便播放器能够识别解密片段所需的密钥。

浏览器不会默认支持数字版权管理(DRM)。HTML5规范说明可以通过加密媒体扩展(EME)实现,但目前还未实现。

因此,您有以下选择:

  1. 使用Flash并通过自己的算法获取密钥
  2. 编写自己的插件(扩展)
  3. 像Netflix这样的大公司与浏览器供应商达成协议,支持您的DRM,即内容保护和密钥分发。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接