如何通過對視頻內容文件加密實現防盜鏈☧☬☸✡♁✙♆。,、':∶;?
隨著在線視頻和在線教育以的興起☧☬☸✡♁✙♆。,、':∶;,在線視頻系統越來越多ⓚⓛⓜⓝⓞⓟⓠⓡⓢ,如在線知識網站㈠㈡㈢㈣㈤㈥㈦、在線課程❋❀⚘☑✓✔√☐☒✗✘ㄨ✕✖✖⋆✢✣、在線教育培訓等網站㈠㈡㈢㈣㈤㈥㈦,我們之前講過關于視頻網站的搭建ⒺⒻⒼⒽⒾⒿⓀⓁⓂⓃⓄⓅⓆⓇⓈⓉ、視頻的云存儲✺ϟ☇♤♧♡♢♠♣♥、視頻的加速播放等⒜⒝⒞⒟⒠⒡⒢⒣⒤,今天的主要話題是視頻內容如何防盜鏈或者防止非法下載⒜⒝⒞⒟⒠⒡⒢⒣⒤。
我們之前有講過一篇文章⑰⑱⑲⑳⓪⓿❶❷❸❹❺,視頻播放如何實現防盜鏈♦☜☞☝✍☚☛☟✌✽✾✿❁❃,此文主要是對播放地址加Token的方式來實現放盜鏈❣❦❧♡۵,但是token很容易獲取⒥⒦⒧⒨⒩⒪⒫⒬⒭⒮⒯⒰⒱⒲⒳⒴⒵❆❇❈❉❊†☨✞✝☥☦☓☩☯,并且視頻文件也很容易緩存下來⓱⓲⓳⓴⓵⓶⓷⓸⓹⓺⓻⓼⓽⓾,來將緩存的視頻進行提取即可✺ϟ☇♤♧♡♢♠♣♥。
本文主要介紹웃유ღ♋♂,通過對視頻內容文件進行加密的方式來實現放盜鏈⓱⓲⓳⓴⓵⓶⓷⓸⓹⓺⓻⓼⓽⓾,這樣可以避免非授權用戶通過播放URL下載或播放點播視頻㈧㈨㈩⑴⑵⑶⑷⑸⑹⑺⑻⑼⑽⑾⑿⒀⒁⒂,有效的實現對視頻內容的版權保護㈠㈡㈢㈣㈤㈥㈦,算是更高級的加密方式ⅲⅳⅴⅵⅶⅷⅸⅹⒶⒷⒸⒹ。

視頻的播放格式介紹
先介紹一下網站的流媒體視頻播放格式♦☜☞☝✍☚☛☟✌✽✾✿❁❃,HLS웃유ღ♋♂,Http Live Streaming 是由Apple公司定義的用于實時流傳輸的協議⒔⒕⒖⒗⒘⒙⒚⒛ⅠⅡⅢⅣⅤⅥⅦⅧⅨⅩⅪⅫⅰⅱ,HLS基于HTTP協議實現⒔⒕⒖⒗⒘⒙⒚⒛ⅠⅡⅢⅣⅤⅥⅦⅧⅨⅩⅪⅫⅰⅱ,傳輸內容包括兩部分✺ϟ☇♤♧♡♢♠♣♥,一是m3u8描述文件❣❦❧♡۵,二是TS媒體文件ⓚⓛⓜⓝⓞⓟⓠⓡⓢ,統稱M3U8格式⓱⓲⓳⓴⓵⓶⓷⓸⓹⓺⓻⓼⓽⓾。
m3u8格式的文件只是存儲多媒體播放列表☾☽❄☃,提供了一個指向其他位置的音頻視頻文件的索引✵✶✷✸✹✺✻✼❄❅,你播放的還是那些被指向的文件⒜⒝⒞⒟⒠⒡⒢⒣⒤,是一系列的TS文件☈⊙☉℃℉❅,本分成多個TS文件主要是為了方便加載①②③④⑤⑥⑦⑧⑨⑩⑪⑫⑬⑭⑮⑯,比如用戶拖動進度條㈠㈡㈢㈣㈤㈥㈦,就可以直接跳轉到對應的TS文件即可⒜⒝⒞⒟⒠⒡⒢⒣⒤,不需要加載整個視頻文件✵✶✷✸✹✺✻✼❄❅,因而節省了網絡帶寬☈⊙☉℃℉❅。
m3u8格式的優點:
- 可以多碼率的適配㈧㈨㈩⑴⑵⑶⑷⑸⑹⑺⑻⑼⑽⑾⑿⒀⒁⒂。根據網絡帶寬✤✥❋✦✧✩✰✪✫✬✭✮✯❂✡★✱✲✳✴,客戶端會自動選擇一個適合自己碼率的文件進行播放㈠㈡㈢㈣㈤㈥㈦,保證視頻流的流暢웃유ღ♋♂,代表是蘋果的HLS(HTTP Live Streaming)✺ϟ☇♤♧♡♢♠♣♥。HLS有一個特點:自適應碼率流播(adaptive streaming)✵✶✷✸✹✺✻✼❄❅,客戶端可以根據網絡狀況自動選擇不同碼率的視頻流♀☿☼☀☁☂☄,條件允許的情況下使用高碼率⓱⓲⓳⓴⓵⓶⓷⓸⓹⓺⓻⓼⓽⓾,網絡繁忙的時候使用低碼率⑰⑱⑲⑳⓪⓿❶❷❸❹❺,并且自動在二者間隨意切換✤✥❋✦✧✩✰✪✫✬✭✮✯❂✡★✱✲✳✴。這對移動設備網絡狀況不穩定的情況下保障流暢播放非常有幫助❋❀⚘☑✓✔√☐☒✗✘ㄨ✕✖✖⋆✢✣。
- 降低源服務器的負載壓力ⓚⓛⓜⓝⓞⓟⓠⓡⓢ。M3U的特點是將流媒體切分為若干 TS 片段㈠㈡㈢㈣㈤㈥㈦,然后通過一個擴展的 m3u 列表文件將這些 TS 片段集中起來供客戶端播放器接收①②③④⑤⑥⑦⑧⑨⑩⑪⑫⑬⑭⑮⑯。這樣做相比使用 RTSP 協議的好處在于✺ϟ☇♤♧♡♢♠♣♥,一旦切分完成❋❀⚘☑✓✔√☐☒✗✘ㄨ✕✖✖⋆✢✣,之后的分發過程完全不需要額外使用任何專門軟件⓱⓲⓳⓴⓵⓶⓷⓸⓹⓺⓻⓼⓽⓾,普通的網絡服務器即可ⅲⅳⅴⅵⅶⅷⅸⅹⒶⒷⒸⒹ,大大降低了 CDN 邊緣服務器的配置要求⒥⒦⒧⒨⒩⒪⒫⒬⒭⒮⒯⒰⒱⒲⒳⒴⒵❆❇❈❉❊†☨✞✝☥☦☓☩☯,可以使用任何現成的CDN☈⊙☉℃℉❅。分發使用的協議是最常見 HTTP⒜⒝⒞⒟⒠⒡⒢⒣⒤,代理服務器對這個協議的緩存優化相當成熟♀☿☼☀☁☂☄,而很少有代理服務器對 RTSP 的進行緩存優化㈠㈡㈢㈣㈤㈥㈦。
- 對于非實時視頻⒜⒝⒞⒟⒠⒡⒢⒣⒤,播放使用HTTP協議的單個 MP4 格式的視頻文件時⒔⒕⒖⒗⒘⒙⒚⒛ⅠⅡⅢⅣⅤⅥⅦⅧⅨⅩⅪⅫⅰⅱ,需要代理服務器支持 HTTP range request 以獲取大文件中的一部分ⓊⓋⓌⓍⓎⓏⓐⓑⓒⓓⓔⓕⓖⓗⓘⓙ,但不是所有的代理服務器都對此有良好的支持㊀㊁㊂㊃㊄㊅㊆㊇㊈㊉。而 M3U 則只需要根據列表文件中的時間軸找出對應的 TS 片段下載即可㊀㊁㊂㊃㊄㊅㊆㊇㊈㊉,不需要 range request웃유ღ♋♂,對代理服務器的要求小很多㈧㈨㈩⑴⑵⑶⑷⑸⑹⑺⑻⑼⑽⑾⑿⒀⒁⒂。所有代理服務器都支持小文件的高效緩存①②③④⑤⑥⑦⑧⑨⑩⑪⑫⑬⑭⑮⑯。
- 為什么要用 TS 而不是 MP4㈧㈨㈩⑴⑵⑶⑷⑸⑹⑺⑻⑼⑽⑾⑿⒀⒁⒂,這是因為兩個 TS 片段可以無縫拼接ⓚⓛⓜⓝⓞⓟⓠⓡⓢ,播放器能連續播放ⓣⓤⓥⓦⓧⓨⓩ,而 MP4 文件由于編碼方式的原因ⓣⓤⓥⓦⓧⓨⓩ,兩段 MP4 不能無縫拼接❋❀⚘☑✓✔√☐☒✗✘ㄨ✕✖✖⋆✢✣,播放器連續播放兩個 MP4 文件會出現破音和畫面間斷❣❦❧♡۵,影響用戶體驗⒃⒄⒅⒆⒇⒈⒉⒊⒋⒌⒍⒎⒏⒐⒑⒒⒓。

視頻加密實現原理
視頻網站的加密就是對HLS/M3U8文件的加密웃유ღ♋♂,使用HLS加密時⒔⒕⒖⒗⒘⒙⒚⒛ⅠⅡⅢⅣⅤⅥⅦⅧⅨⅩⅪⅫⅰⅱ,初時生成的密鑰是存儲在點播服務中的㈧㈨㈩⑴⑵⑶⑷⑸⑹⑺⑻⑼⑽⑾⑿⒀⒁⒂,業務側在初步播放時需要從點播中查詢獲取密鑰☈⊙☉℃℉❅,這要求業務側自行搭建密鑰管理服務ⓊⓋⓌⓍⓎⓏⓐⓑⓒⓓⓔⓕⓖⓗⓘⓙ,組裝帶token的播放url⒔⒕⒖⒗⒘⒙⒚⒛ⅠⅡⅢⅣⅤⅥⅦⅧⅨⅩⅪⅫⅰⅱ,從點播服務中獲取密鑰㈠㈡㈢㈣㈤㈥㈦,緩存后再返回給播放器解密播放⒔⒕⒖⒗⒘⒙⒚⒛ⅠⅡⅢⅣⅤⅥⅦⅧⅨⅩⅪⅫⅰⅱ。
視頻加密原理㊀㊁㊂㊃㊄㊅㊆㊇㊈㊉,主要是通過指定的AES-128加密算法來加密每一個TS☧☬☸✡♁✙♆。,、':∶;,并在生成的m3u8文件中描述播放器如何解密TS文件的方法⒔⒕⒖⒗⒘⒙⒚⒛ⅠⅡⅢⅣⅤⅥⅦⅧⅨⅩⅪⅫⅰⅱ,支持所有的HLS播放器ⓣⓤⓥⓦⓧⓨⓩ,前端播放器根據業務規則⒜⒝⒞⒟⒠⒡⒢⒣⒤,獲取解密秘鑰ⓣⓤⓥⓦⓧⓨⓩ,然后解密TS文件☧☬☸✡♁✙♆。,、':∶;,進行解密播放✺ϟ☇♤♧♡♢♠♣♥。

加密過程:
- 業務側將視頻上傳到點播服務(VOD)后❋❀⚘☑✓✔√☐☒✗✘ㄨ✕✖✖⋆✢✣,請求HLS加密㊀㊁㊂㊃㊄㊅㊆㊇㊈㊉。
- 點播服務收到加密請求后ⒺⒻⒼⒽⒾⒿⓀⓁⓂⓃⓄⓅⓆⓇⓈⓉ,向KMS請求加密密鑰⒃⒄⒅⒆⒇⒈⒉⒊⒋⒌⒍⒎⒏⒐⒑⒒⒓,并將獲取的密鑰ID和密鑰密文存儲在點播服務中✵✶✷✸✹✺✻✼❄❅。
- 點播服務向媒體處理服務請求HLS加密⑰⑱⑲⑳⓪⓿❶❷❸❹❺,媒體處理服務通過轉碼功能將對應的視頻進行加密ⓊⓋⓌⓍⓎⓏⓐⓑⓒⓓⓔⓕⓖⓗⓘⓙ。
轉碼加密后生成的m3u8文件帶有“#EXT-X-KEY”標簽㊀㊁㊂㊃㊄㊅㊆㊇㊈㊉,該標簽包含了“METHOD”和“URI”屬性❻❼❽❾❿⓫⓬⓭⓮⓯⓰,其中“URI”即為業務側搭建的密鑰管理服務的地址ⓊⓋⓌⓍⓎⓏⓐⓑⓒⓓⓔⓕⓖⓗⓘⓙ。
- 加密后⒥⒦⒧⒨⒩⒪⒫⒬⒭⒮⒯⒰⒱⒲⒳⒴⒵❆❇❈❉❊†☨✞✝☥☦☓☩☯,點播服務通過CDN將加密的HLS視頻文件進行加速分發⒃⒄⒅⒆⒇⒈⒉⒊⒋⒌⒍⒎⒏⒐⒑⒒⒓。
解密過程:
- 終端用戶登錄播放器終端☧☬☸✡♁✙♆。,、':∶;,業務側會對終端用戶進行身份校驗ⅲⅳⅴⅵⅶⅷⅸⅹⒶⒷⒸⒹ,校驗通過后⓱⓲⓳⓴⓵⓶⓷⓸⓹⓺⓻⓼⓽⓾,會為播放終端分配一個Token⒜⒝⒞⒟⒠⒡⒢⒣⒤,并將帶Token的播放地址返回給播放器端❋❀⚘☑✓✔√☐☒✗✘ㄨ✕✖✖⋆✢✣。
- 播放器終端通過帶Token的播放URL向CDN請求播放ⓚⓛⓜⓝⓞⓟⓠⓡⓢ。由于Token是動態的⒃⒄⒅⒆⒇⒈⒉⒊⒋⒌⒍⒎⒏⒐⒑⒒⒓,所以CDN收到請求后♦☜☞☝✍☚☛☟✌✽✾✿❁❃,會直接回源到點播服務㈠㈡㈢㈣㈤㈥㈦。點播服務會將請求URL中的Token寫入請求的m3u8文件的“URI”中ⒺⒻⒼⒽⒾⒿⓀⓁⓂⓃⓄⓅⓆⓇⓈⓉ。點播服務返回給CDN的m3u8文件中會攜帶播放終端的Token值❋❀⚘☑✓✔√☐☒✗✘ㄨ✕✖✖⋆✢✣。
- 播放終端解析返回的m3u8文件⒜⒝⒞⒟⒠⒡⒢⒣⒤,得到EXT-X-KEY標簽中的“URI”內容✵✶✷✸✹✺✻✼❄❅,向“URI”請求密鑰❣❦❧♡۵。
- 業務側的密鑰管理服務收到請求后♦☜☞☝✍☚☛☟✌✽✾✿❁❃,先驗證Token的合法性㈠㈡㈢㈣㈤㈥㈦,若Token合法ⓚⓛⓜⓝⓞⓟⓠⓡⓢ,則通過調用點播服務的API查詢密鑰☈⊙☉℃℉❅。
密鑰管理服務可以選擇將查詢到的密鑰緩存在本地ⅲⅳⅴⅵⅶⅷⅸⅹⒶⒷⒸⒹ,當下次有其它播放終端請求時⓱⓲⓳⓴⓵⓶⓷⓸⓹⓺⓻⓼⓽⓾,可以直接返回⒃⒄⒅⒆⒇⒈⒉⒊⒋⒌⒍⒎⒏⒐⒑⒒⒓,無需每次都向點播服務獲取⒃⒄⒅⒆⒇⒈⒉⒊⒋⒌⒍⒎⒏⒐⒑⒒⒓。
- 密鑰管理服務將點播服務返回的密鑰返回給播放終端㈧㈨㈩⑴⑵⑶⑷⑸⑹⑺⑻⑼⑽⑾⑿⒀⒁⒂。播放終端通過獲取的密鑰解密播放m3u8文件✵✶✷✸✹✺✻✼❄❅。
代碼實現方式
加密服務一般由第三方服務實現㊀㊁㊂㊃㊄㊅㊆㊇㊈㊉,以及直接格式轉換✵✶✷✸✹✺✻✼❄❅,比如一些云廠商或者視頻托管廠商✤✥❋✦✧✩✰✪✫✬✭✮✯❂✡★✱✲✳✴,如果要自建⒃⒄⒅⒆⒇⒈⒉⒊⒋⒌⒍⒎⒏⒐⒑⒒⒓,用萬能的 ffmpeg 也可以實現⒜⒝⒞⒟⒠⒡⒢⒣⒤,簡單過程如下:
1. Key文件
#!/bin/sh BASE_URL=${1:-'.'}
openssl rand 16 > file.key
echo $BASE_URL/file.key > file.keyinfo
echo file.key >> file.keyinfo
echo $(openssl rand -hex 16) >> file.keyinfo
參數詳解:
BASE_URL:網站url地址
openssl rand 16 > file.key 生成一個key文件
echo $BASE_URL/file.key > file.keyinfo 將外部訪問的file.key映射到file.keyinfo文件中웃유ღ♋♂。
echo file.key >> file.keyinfo 將項目file.key所在的文件路徑映射到fike.keyinfo文件中ⅲⅳⅴⅵⅶⅷⅸⅹⒶⒷⒸⒹ。
echo $(openssl rand -hex 16) >> file.keyinfo 生成IV密鑰
2. 執行命令
ffmpeg -y -i 視頻文件絕對路徑/202203271023300d469.mp4 \
-preset:v veryfast -hls_time 5 -c:a aac -hls_key_info_file ase加密文件的絕對路徑/file.keyinfo \
-hls_segment_filename 轉碼之后的ts文件的存放路徑/%04d.ts \
-hls_list_size 0 轉碼之后m3u8文件存放的絕對路徑/index.m3u8參數說明:
-hls_key_info_file 加密文件的路徑 這個指令是轉碼之后ts文件是否加密的關鍵指令

轉換前的文件

轉換后的文件
結論
所以☧☬☸✡♁✙♆。,、':∶;,對TS的加密從而達到對視頻加密的目的ⅲⅳⅴⅵⅶⅷⅸⅹⒶⒷⒸⒹ,將加密后的視頻地址存放到CMS管理⒜⒝⒞⒟⒠⒡⒢⒣⒤,在APP/網站等播放器端進行技術對接⒔⒕⒖⒗⒘⒙⒚⒛ⅠⅡⅢⅣⅤⅥⅦⅧⅨⅩⅪⅫⅰⅱ,使得加密視頻只能在特定的APP/網站中使用ⓚⓛⓜⓝⓞⓟⓠⓡⓢ,即使用戶下載了TS文件⓱⓲⓳⓴⓵⓶⓷⓸⓹⓺⓻⓼⓽⓾,也無法解密播放ⓊⓋⓌⓍⓎⓏⓐⓑⓒⓓⓔⓕⓖⓗⓘⓙ,安全性更高㈧㈨㈩⑴⑵⑶⑷⑸⑹⑺⑻⑼⑽⑾⑿⒀⒁⒂。
最終使用了加密播放的視頻웃유ღ♋♂,可以實現有效的版權保護✺ϟ☇♤♧♡♢♠♣♥、二次售賣等一些用戶的非法操作ⒺⒻⒼⒽⒾⒿⓀⓁⓂⓃⓄⓅⓆⓇⓈⓉ,從而實現了對我們內容的有效保護⒃⒄⒅⒆⒇⒈⒉⒊⒋⒌⒍⒎⒏⒐⒑⒒⒓。
歡迎轉載⓱⓲⓳⓴⓵⓶⓷⓸⓹⓺⓻⓼⓽⓾,請注明出處♦☜☞☝✍☚☛☟✌✽✾✿❁❃!
關于CMS的架構和在線教育網站的搭建ⓚⓛⓜⓝⓞⓟⓠⓡⓢ,也可以參考我們之前相關的文章介紹❋❀⚘☑✓✔√☐☒✗✘ㄨ✕✖✖⋆✢✣,
3. 在線視頻教育學習平臺介紹