HLS AES加密
HLS AES加密
HLS AES加密介绍
HLS AES加密是一种用于保护HLS流内容安全的加密技术。它通过将HLS媒体文件进行分段,并使用AES加密算法对每个片段进行加密,从而防止未经授权的访问和内容盗取。
HLS AES加密的功能主要包括以下方面:
内容保护:使用AES加密算法对HLS媒体片段进行加密,确保媒体内容在传输和存储过程中的安全性。只有拥有相应密钥的用户才能解密和播放内容。
防止盗链:通过加密HLS媒体片段,防止未经授权的第三方站点直接链接到您的媒体内容。只有通过合法的许可方式获得密钥的用户才能成功解密并播放媒体。
安全传输:加密后的HLS媒体片段在传输过程中具有更高的安全性,即使在不安全的网络环境下,也能有效保护媒体内容的机密性。
多级加密:HLS AES加密支持多种加密模式和密钥管理方案,可以根据需求选择合适的加密算法和密钥管理策略,提供更高级别的安全保护。
通过使用HLS AES加密,您可以保护您的媒体内容免受未经授权的访问和盗取,确保内容在传输和播放过程中的安全性和机密性。
在HLS加密中,有几个重要字段和参数用于描述和控制加密操作。
- EXT-X-KEY: 这是一个标签,用于指定HLS媒体流的加密参数。它包含了以下几个属性:
- METHOD:指定使用的加密方法,常见的有AES-128、SAMPLE-AES等。
- URI: 这是密钥的URL或文件路径,用于指定加密所需的密钥。通常,密钥会单独保存在另一个文件中或通过网络进行获取。
- IV: 这是初始化向量(Initialization Vector),用于AES加密过程中的初始状态。它与密钥一起用于生成加密密钥流。
示例如下
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:129
#EXT-X-MEDIA-SEQUENCE:0
#EXT-X-PLAYLIST-TYPE:VOD
#EXT-X-KEY:METHOD=AES-128,URI="http://192.168.1.247/aes.key",IV=0x0102030405060707090a0b0c0d0e0f10
#EXTINF:129.221022,
file0.ts
#EXT-X-ENDLIST
HLS AES加密实现
HLS加密需要key文件和IV,可以选择使用OpenSSL手动生成key,和IV,然后将其分别写入key文件和keyinfo文件(文件名并非固定,可随意命名,此处分别命名为encrypt.key和encrypt.keyinfo),然后通过ffmpeg对源视频进行切片及AES加密。手动生成命令如下
- 生成encrypt.key
openssl rand 16 > [密钥存放路径] - 生成IV
openssl rand -hex 16
# 假设本次生成的字符串为:2e38dfa3b8e04ef036e3e09d2bca08e7
- keyinfo文件内容如下
- 第一行为解密文件的url,也可以替换为加密文件的路径,用于播放时,播放器寻找key文件
- 第二行为加密文件的路径
- 第三行为上述生成的IV
encrypt.keyinfohttp://localhost:8000/encrypt.key
D:\video\test\encrypt.key
2e38dfa3b8e04ef036e3e09d2bca08e7
如果不想一步一步的手动生成,也可使用下面的python脚本,修改url和需要存放加密文件的路径,运行脚本,就会自动生成16位AES密钥和IV,并将其写入encrypt.key和encrypt.keyinfo
- key生成脚本
generat_key.pyimport os
import binascii def generate_key(file_path: str, key_url=None, length=16) -> str:
# 随机生成16位AES密钥
key = os.urandom(length)
# 随机生成16位IV
iv = os.urandom(length)
# 将IV转化为16进制,用字符串表示,生成的16进制字符串将具有双倍的长度,因为每个字节对应两个十六进制字符
iv_string = binascii.hexlify(iv).decode('utf-8')
file_name = f"{file_path}/encrypt.key"
key_info = f"{file_path}/encrypt.keyinfo"
if key_url is None:
key_url = file_name
# 将密钥写入key文件
with open(file_name, 'wb') as f:
f.write(key)
# 将密钥信息和IV写入keyinfo文件
with open(key_info, 'wb') as f:
f.write(key_url.encode('utf-8'))
f.write('\n'.encode('utf-8'))
f.write(file_name.encode('utf-8'))
f.write('\n'.encode('utf-8'))
f.write(iv_string.encode('utf-8'))
return file_name if __name__ == "__main__":
ret = generate_key("D:/video/aes/test")
print(f"key file path < {ret} >")
生成encrypt.key和encrypt.keyinfo文件后,执行命令对源视频进行切片及AES加密
ffmpeg -i cat.flv -c:v libx264 -c:a copy -f hls -hls_time 10 -hls_list_size 0 -hls_key_info_file encrypt.keyinfo -hls_playlist_type vod -hls_segment_filename ./file%d.ts ./playlist.m3u8
注意,需要先安装ffmpeg,安装方法可参考ffmpeg官网。如果不想自己编译,可直接下载官方的exe文件
生成的m3u8文件如下
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:18
#EXT-X-MEDIA-SEQUENCE:0
#EXT-X-PLAYLIST-TYPE:VOD
#EXT-X-KEY:METHOD=AES-128,URI="D:/video/aes/test/encrypt.key",IV=0x2e38dfa3b8e04ef036e3e09d2bca08e7
#EXTINF:11.886878,
file0.ts
#EXTINF:11.136122,
......省略......
file11.ts
#EXT-X-ENDLIST
可能遇到的问题
当m3u8文件中,URL为文件路径时,直接播放playlist.m3u8文件可能会因为协议类型而无法找到encrypt.key,可以通过ffply加上-allowed_extensions ALL参数,即可正常播放视频。添加了-allowed_extensions ALL选项来允许处理所有类型的文件,包括具有非常见扩展名的文件。完整命令如下:
ffplay -allowed_extensions ALL .\playlist.m3u8
HLS AES加密的更多相关文章
- 关于CryptoJS中md5加密以及aes加密的随笔
最近项目中用到了各种加密,其中就包括从没有接触过得aes加密,因此从网上各种查,官方的一种说法: 高级加密标准(英语:Advanced Encryption Standard,缩写:AES),在密码学 ...
- AES加密
package com.edu.hpu; import java.math.BigInteger; import java.security.MessageDigest; import java.se ...
- Android数据加密之Aes加密
前言: 项目中除了登陆,支付等接口采用rsa非对称加密,之外的采用aes对称加密,今天我们来认识一下aes加密. 其他几种加密方式: Android数据加密之Rsa加密 Android数据加密之Aes ...
- c#和js互通的AES加密解密
一.使用场景 在使用前后端分离的框架中常常会进行传输数据相互加密解密以确保数据的安全性,如web Api返回加密数据客户端或web端进行解密,或者客户端或web端进行加密提交数据服务端解密数据等等. ...
- AES加密解密通用版Object-C / C# / JAVA
1.无向量 128位 /// <summary> /// AES加密(无向量) /// </summary> /// <param name="plainByt ...
- nodejs与javascript中的aes加密
简介 1.aes加密简单来说,在密码学中又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准.这个标准用来替代原先的DES,已经被多方分析且广为全世界所使用.高级加密标准已然成为对称密钥加 ...
- 非对称技术栈实现AES加密解密
非对称技术栈实现AES加密解密 正如前面的一篇文章所述,https协议的SSL层是实现在传输层之上,应用层之下,也就是说在应用层上看到的请求还是明码的,对于某些场景下要求这些http请求参数是非可读的 ...
- Java aes加密C#解密的取巧方法
摘要: 项目开发过程中遇到一个棘手的问题:A系统使用java开发,通过AES加密数据,B系统使用C#开发,需要从A系统获取数据,但在AES解密的时候遇到麻烦.Java的代码和C#的代码无法互通. Ja ...
- AES 加密工具类
/** * AES 是一种可逆加密算法,对用户的敏感信息加密处理 对原始数据进行AES加密后,在进行Base64编码转化: */public class AESOperator { /* * 加密用的 ...
- android base64 和 aes 加密 解密
package pioneerbarcode.ccw.com.encryptanddecode;import android.os.Bundle;import android.support.v7.a ...
随机推荐
- 驱动开发:探索DRIVER_OBJECT驱动对象
本章将探索驱动程序开发的基础部分,了解驱动对象DRIVER_OBJECT结构体的定义,一般来说驱动程序DriverEntry入口处都会存在这样一个驱动对象,该对象内所包含的就是当前所加载驱动自身的一些 ...
- Python集合常用操作
一.集合的介绍 1.定义:集合是无序的,集合中的元素是唯一的,集合一般用于元组或者列表中的元素去重. 2.特性:集合的目的是将不同的值存放在一起,不同的集合间用来做关系运算,无须纠结于集合中的 ...
- 机器学习(六):回归分析——鸢尾花多变量回归、逻辑回归三分类只用numpy,sigmoid、实现RANSAC 线性拟合
[实验1 回归分析] 一. 预备知识 使用梯度下降法求解多变量回归问题 数据集 Iris 鸢尾花数据集是一个经典数据集,在统计学习和机器学习领域都经常被用作示例.数据集内包含 3 类共 150 条记录 ...
- CSS笔记(待完善)
CSS笔记 css权重 ID(100)> class(10)> element(1) css最高权重 !important 块元素(block) 可以设置宽度和高度,独立成行. h1~h6 ...
- 即时通讯系统为什么选择GaussDB(for Redis)?
摘要:如果你需要一款稳定可靠的高性能企业级KV数据库,不妨试试GaussDB(for Redis). 每当网络上爆出热点新闻,混迹于各个社交媒体的小伙伴们全都开启了讨论模式.一条消息的产生是如何在群聊 ...
- ArrayList实现原理和自动扩容
ArrayList在Java集合中的位置, ArrayList原理: transient Object[] elementData; ArrayList通过数组来实现. 默认构造方法会构造一个容量为1 ...
- Redis主从和哨兵搭建
今天主要分享Redis主从架构和哨兵的搭建. 主从集群搭建 总共三个节点,一个主节点和两个从节点.都安装在一台机器上模拟主从集群,信息如下: IP PORT 角色 192.168.246.140 70 ...
- 【必知必会的MySQL知识】mysql5.7安装教程
1.下载mysql 下载地址:https://dev.mysql.com/downloads/mysql/5.7.html#downloads 下载zip免安装版,可以省去很多事 2.将下载的安装文件 ...
- Python数据分析中 melt()函数的一些用法
melt()函数是一个数据重塑工具,用于将宽格式数据转换为长格式数据(Unpivot a DataFrame from wide to long format, optionally leaving ...
- 2021-10-23:位1的个数。编写一个函数,输入是一个无符号整数(以二进制串的形式),返回其二进制表达式中数字位数为 ‘1‘ 的个数(也被称为汉明重量)。提示:请注意,在某些语言(如 Java)中
2021-10-23:位1的个数.编写一个函数,输入是一个无符号整数(以二进制串的形式),返回其二进制表达式中数字位数为 '1' 的个数(也被称为汉明重量).提示:请注意,在某些语言(如 Java)中 ...