HLS标准加密

HLS标准加密使用AES_128进行内容加密,适配所有HLS播放器,需要配合密钥管理服务和令牌服务使用,被广泛应用于在线教育、独播剧等对内容安全性要求较高的领域。本文为您介绍如何对视频进行HLS标准加密以及如何进行解密播放。

升级说明

视频点播于2022年08月升级了HLS标准加密服务,优化了加密流程和逻辑,但旧的加密流程仍然可用,建议您使用新的加密流程。若因业务需要,您仍需使用旧的加密流程,可参考HLS标准加密(旧)

工作原理

视频点播采用信封数据加密的方式加密视频。业务方调用阿里云密钥管理服务(KMS)生成数据密钥(DK)和信封数据密钥(EDK),然后利用数据密钥(DK)加密视频,并将加密后的文件和信封数据密钥(EDK)存储。播放器终端通过解密服务获取数据密钥(DK)请求解密播放视频。

如果您需要对解密地址进行安全验证,可以通过开启M3U8标准加密改写(默认改写的参数名为MtsHlsUriToken)实现对HLS数据访问过程的再次加密保护。M3U8标准加密改写的开启方式及技术原理请参见HLS(M3U8)标准加密改写

加密及解密流程

上传及加密流程视频安全-HLS标准加密3

解密播放流程

开启M3U8标准加密改写(推荐)

视频安全-HLS标准加密6..png

未开启M3U8标准加密改写

视频安全-HLS标准加密2

相关概念

概念

说明

访问控制RAM(Resource Access Management)

是阿里云提供的管理用户身份与资源访问权限的服务。更多信息,请参见访问控制

密钥管理服务KMS(Key Management Service)

是一站式密钥管理和数据加密服务平台、一站式凭据安全管理平台,提供简单、可靠、安全、合规的数据加密保护和凭据管理能力。更多信息,请参见密钥管理服务

数据密钥DK(Data Key)

数据密钥是加密数据使用的明文数据密钥。更多信息,请参见基本概念

信封数据密钥EDK(Enveloped Data Key/Encrypted Data Key)

信封数据密钥是通过信封加密技术保密后的密文数据密钥。更多信息,请参见基本概念

前提条件

  • 已经开通了视频点播服务。开通步骤请参见开通视频点播

  • 已经授权视频点播访问您密钥管理服务的权限,可以通过云资源访问授权页面进行授权。

  • 已在视频点播中配置加速域名,具体步骤请参见添加加速域名

  • 已安装视频点播服务端SDK,具体步骤请参见服务端SDK。本文以Java语言为例进行说明。

加密视频

  1. 创建Service Key。

    Service Key是密钥管理服务的一种加密主Key,接入标准加密的密钥必须要使用该Service Key生成,若不创建Service Key,则后续调用GenerateKMSDataKey - 创建KMS数据密钥接口生成密钥时将会报错。

    1. 登录视频点播控制台,选择配置管理 > 媒体处理配置 > 标准加密

    2. 单击页面左上方的服务地域标识,切换到需要创建Service Key的服务地域下。

      说明

      创建的Service Key与视频存储的源站地域必须一致,例如:视频存储在华东2(上海),则Service Key必须在华东2(上海)创建。

      标准加密-服务地域

    3. 在标准加密页面,单击创建Service Key

      创建成功后,会提示您密钥(Service Key)创建成功,且在密钥信息区域可以查看您的Service Key。

      说明

      若已提示密钥创建成功,仍未看到Service Key,可能是由于服务角色缺失导致,您可以通过重新授权恢复角色后再刷新页面查看Service Key。

  2. 创建用于HLS标准加密的转码模板组。

    HLS标准加密过程中需要用到两个转码模板组:不转码模板组和用于HLS标准加密的模板组。

    其中,不转码模板组为系统内置的模板组,您无需创建可以直接使用;用于HLS标准加密的模板组需要您自行创建。创建方法如下:

    1. 登录视频点播控制台,选择配置管理 > 媒体处理配置 > 转码模板组

    2. 在转码模板组页面创建用于HLS标准加密的模板组。

      其中,封装格式需设置为hls;在高级参数区域,必须开启视频加密,且加密方式勾选私有加密选项;其余参数您可以根据实际需要进行配置,详细的参数解释,请参见配置普通转码模板视频安全-HLS加密-控制台

    3. 模板创建完成后,您可以在转码模板组列表页查看转码模板组的ID,请保存该ID用于后续发起HLS标准加密转码时使用。视频安全-HLS加密-控制台1

  3. 搭建加密服务。

    调用GenerateKMSDataKey - 创建KMS数据密钥接口生成数据密钥(DK)和信封数据密钥(EDK)。

    调用该接口无需传任何参数,接口调用成功后,返回参数CiphertextBlob即为信封数据密钥(EDK),返回参数Plaintext即为数据密钥(DK);其中,CiphertextBlob是一个AES_128的密钥,请保存该参数值用于后续发起标准加密转码时传入。

  4. 使用不转码模板组上传视频。

    因在视频点播中上传视频时会触发自动转码,而自动触发的转码暂不支持HLS标准加密,因此需要HLS标准加密的视频,在上传时需要使用系统内置的不转码模板组进行上传,以防止上传时自动触发转码。

    1. 通过视频点播控制台上传,请参见通过视频点播控制台上传文件;通过服务端接口上传,请参见媒体上传

    2. 配置视频点播的事件通知,当接收到视频上传完成的回调消息时,则表明视频已经上传到视频点播中。事件通知的配置方法,请参见事件通知

  5. 发起HLS标准加密转码。

    1. 调用SubmitTranscodeJobs - 提交媒体转码作业接口,发起HLS标准加密转码。

      展开查看Java示例代码

      下述Java示例代码中,您需要按实际情况变更的参数如下:

      参数

      传入值

      request.setTemplateGroupId("")

      传入步骤二中创建的用于HLS标准加密的转码模板组ID。

      request.setVideoId("")

      传入步骤四中上传的待加密的视频ID。

      encryptConfig.put("CipherText","")

      传入步骤三中返回的CiphertextBlob值。

      encryptConfig.put("DecryptKeyUri","")

      传入密钥URI地址,密钥URI地址由解密服务地址及CiphertextBlob值拼接而成。以在本地的8099端口为例,密钥URI地址如下:

      http://172.16.0.1:8099?CipherText=CiphertextBlob值

      import com.alibaba.fastjson.JSON;
      import com.alibaba.fastjson.JSONObject;
      import com.aliyuncs.DefaultAcsClient;
      import com.aliyuncs.exceptions.ClientException;
      import com.aliyuncs.profile.DefaultProfile;
      import com.aliyuncs.vod.model.v20170321.SubmitTranscodeJobsRequest;
      import com.aliyuncs.vod.model.v20170321.SubmitTranscodeJobsResponse;
      
      public class SubmitTranscodeJobs {
      
          // 阿里云账号AccessKey拥有所有API的访问权限,建议您使用RAM用户进行API访问或日常运维。
          // 强烈建议不要把AccessKey ID和AccessKey Secret保存到工程代码里,否则可能导致AccessKey泄露,威胁您账号下所有资源的安全。
          // 本示例通过从环境变量中读取AccessKey,来实现API访问的身份验证。运行代码示例前,请配置环境变量ALIBABA_CLOUD_ACCESS_KEY_ID和ALIBABA_CLOUD_ACCESS_KEY_SECRET。
          private static String accessKeyId = System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID");
          private static String accessKeySecret = System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET");
      
          public static SubmitTranscodeJobsResponse submitTranscodeJobs(DefaultAcsClient client) throws Exception{
              SubmitTranscodeJobsRequest request = new SubmitTranscodeJobsRequest();
              request.setTemplateGroupId("");
              request.setVideoId("");
              JSONObject encryptConfig = new JSONObject();
              encryptConfig.put("CipherText","");
              encryptConfig.put("DecryptKeyUri","");
              encryptConfig.put("KeyServiceType","KMS");
              request.setEncryptConfig(encryptConfig.toJSONString());
              return client.getAcsResponse(request);
          }
      
          public static void main(String[] args) throws ClientException {
              String regionId = "cn-shanghai";  // 点播服务接入区域
              DefaultProfile profile = DefaultProfile.getProfile(regionId, accessKeyId, accessKeySecret);
              DefaultAcsClient client = new DefaultAcsClient(profile);
      
              SubmitTranscodeJobsResponse response;
              try {
                  response = submitTranscodeJobs(client);
                  System.out.println("RequestId is:"+response.getRequestId());
                  System.out.println("TranscodeTaskId is:"+response.getTranscodeTaskId());
                  System.out.println("TranscodeJobs is:"+ JSON.toJSON(response.getTranscodeJobs()));
              } catch (Exception e) {
                  e.printStackTrace();
              }
          }
      }       
    2. 如果已经配置了视频点播的事件通知,当接收到单个清晰度转码完成全部清晰度转码完成的回调消息时,则表明视频已经转码完成。

  6. 查看HLS标准加密结果。

    转码完成后,您可以通过如下两种方式来判断标准加密是否成功。

    • 方式一:登录视频点播控制台,选择媒资库 > 音/视频 > 管理 > 视频地址,在视频地址页面,如果视频有多种格式的输出(例如还存在格式为mp4的原始文件),只需要查看m3u8格式的视频流是否带有标准加密字样,如果存在,则表明标准加密成功。视频安全-HLS标准加密5

    • 方式二:将带有标准加密字样的M3U8文件的地址拷贝出来,使用命令curl -v "M3U8文件地址",查看获取到的M3U8内容是否存在URI="<业务方在发起标准加密时传递的解密URI地址,即DecryptKeyUri参数值>"关键信息,有则表明为标准加密且加密成功。

播放HLS标准加密视频

  1. 搭建解密服务。

    搭建一个本地HTTP服务,用于解密视频。

    调用DecryptKMSDataKey - 解密KMS数据密钥密文接口进行解密,该接口返回的数据密钥(DK)即PlainTextGenerateKMSDataKey - 创建KMS数据密钥接口返回的PlainText经过base64_decode之后的数据。

    如果您需要对解密地址进行安全验证,可以通过开启M3U8标准加密改写(默认改写的参数名为MtsHlsUriToken)实现对HLS数据访问过程的再次加密保护。M3U8标准加密改写的开启方式及技术原理请参见HLS(M3U8)标准加密改写。根据您是否开启M3U8标准加密改写,搭建解密服务的代码实现不同,具体如下:

    • 开启M3U8标准加密改写(推荐)

      展开查看Java示例代码

      下述Java示例代码仅供参考,您可以按实际需要自行实现解密及MtsHlsUriToken的校验逻辑。下述示例代码中,您需要按实际情况变更的参数如下:

      参数

      传入值

      region

      地域标识,要求KMS服务的地域和点播视频所在的地域保持一致。例如华东2(上海),填写cn-shanghai,其他地域标识请参见点播地域标识

      AccessKey

      传入阿里云账号或RAM用户的AccessKey ID和AccessKey Secret,获取方法请参见创建AccessKey

      httpserver

      根据需求选择服务启动的端口号。

      import com.aliyuncs.DefaultAcsClient;
      import com.aliyuncs.exceptions.ClientException;
      import com.aliyuncs.http.ProtocolType;
      import com.aliyuncs.vod.model.v20170321.DecryptKMSDataKeyRequest;
      import com.aliyuncs.vod.model.v20170321.DecryptKMSDataKeyResponse;
      import com.aliyuncs.profile.DefaultProfile;
      import com.sun.net.httpserver.Headers;
      import com.sun.net.httpserver.HttpExchange;
      import com.sun.net.httpserver.HttpHandler;
      import com.sun.net.httpserver.HttpServer;
      import com.sun.net.httpserver.spi.HttpServerProvider;
      import org.apache.commons.codec.binary.Base64;
      import java.io.IOException;
      import java.io.OutputStream;
      import java.net.HttpURLConnection;
      import java.net.InetSocketAddress;
      import java.net.URI;import java.util.regex.Matcher;
      import java.util.regex.Pattern;
      public class HlsDecryptServer {
          private static DefaultAcsClient client;
          static {
              //KMS的区域,必须与视频对应区域
              String region = "";
              // 访问KMS的授权AccessKey信息
              // 阿里云账号AccessKey拥有所有API的访问权限,建议您使用RAM用户进行API访问或日常运维。
              // 强烈建议不要把AccessKey ID和AccessKey Secret保存到工程代码里,否则可能导致AccessKey泄露,威胁您账号下所有资源的安全。
              // 本示例通过从环境变量中读取AccessKey,来实现API访问的身份验证。运行代码示例前,请配置环境变量ALIBABA_CLOUD_ACCESS_KEY_ID和ALIBABA_CLOUD_ACCESS_KEY_SECRET。
              String accessKeyId = System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID");
              String accessKeySecret = System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET");
              client = new DefaultAcsClient(DefaultProfile.getProfile(region, accessKeyId, accessKeySecret));
          }
          /**
           * 说明:
           * 1、接收解密请求,获取密文密钥和用户令牌Token
           * 2、调用KMS decrypt接口获取明文密钥
           * 3、将明文密钥Base64 decode返回
           */
          public class HlsDecryptHandler implements HttpHandler {
              /**
               * 处理解密请求
               * @param httpExchange
               * @throws IOException
               */
              public void handle(HttpExchange httpExchange) throws IOException {
                  String requestMethod = httpExchange.getRequestMethod();
                  if ("GET".equalsIgnoreCase(requestMethod)) {
                      //校验token的有效性
                      String token = getMtsHlsUriToken(httpExchange);
                      boolean validRe = validateToken(token);
                      if (!validRe) {
                          return;
                      }
                      //从URL中取得密文密钥
                      String ciphertext = getCiphertext(httpExchange);
                      if (null == ciphertext)
                          return;
                      //从KMS中解密出来,并Base64 decode
                      byte[] key = decrypt(ciphertext);
                      //设置header
                      setHeader(httpExchange, key);
                      //返回Base64 decode之后的密钥
                      OutputStream responseBody = httpExchange.getResponseBody();
                      responseBody.write(key);
                      responseBody.close();
                  }
              }
              private void setHeader(HttpExchange httpExchange, byte[] key) throws IOException {
                  Headers responseHeaders = httpExchange.getResponseHeaders();
                  responseHeaders.set("Access-Control-Allow-Origin", "*");
                  httpExchange.sendResponseHeaders(HttpURLConnection.HTTP_OK, key.length);
              }
              /**
               * 调用KMS decrypt接口解密,并将明文Base64 decode
               * @param ciphertext
               * @return
               */
              private byte[] decrypt(String ciphertext) {
                  DecryptKMSDataKeyRequest request = new DecryptKMSDataKeyRequest();
                  request.setCipherText(ciphertext);
                  request.setProtocol(ProtocolType.HTTPS);
                  try {
                      DecryptKMSDataKeyResponse response = client.getAcsResponse(request);
                      String plaintext = response.getPlaintext();
                      System.out.println("PlainText: " + plaintext);
                      //注意:需要Base64 decode
                      return Base64.decodeBase64(plaintext);
                  } catch (ClientException e) {
                      e.printStackTrace();
                      return null;
                  }
              }
              /**
               * 校验令牌有效性
               * @param token
               * @return
               */
              private boolean validateToken(String token) {
                  if (null == token || "".equals(token)) {
                      return false;
                  }
                  //TODO 业务方实现令牌有效性校验
                  return true;
              }
              /**
               * 从URL中获取密文密钥参数
               * @param httpExchange
               * @return
               */
              private String getCiphertext(HttpExchange httpExchange) {
                  URI uri = httpExchange.getRequestURI();
                  String queryString = uri.getQuery();
                  String pattern = "CipherText=(\\w*)";
                  Pattern r = Pattern.compile(pattern);
                  Matcher m = r.matcher(queryString);
                  if (m.find())
                      return m.group(1);
                  else {
                      System.out.println("Not Found CipherText Param");
                      return null;
                  }
              }
              /**
               * 获取Token参数
               *
               * @param httpExchange
               * @return
               */
              private String getMtsHlsUriToken(HttpExchange httpExchange) {
                  URI uri = httpExchange.getRequestURI();
                  String queryString = uri.getQuery();
                  String pattern = "MtsHlsUriToken=(\\w*)";
                  Pattern r = Pattern.compile(pattern);
                  Matcher m = r.matcher(queryString);
                  if (m.find())
                      return m.group(1);
                  else {
                      System.out.println("Not Found MtsHlsUriToken Param");
                      return null;
                  }
              }
          }
          /**
           * 服务启动
           *
           * @throws IOException
           */
          private void serviceBootStrap() throws IOException {
              HttpServerProvider provider = HttpServerProvider.provider();
              //监听端口可以自定义,能同时接受最多30个请求
              HttpServer httpserver = provider.createHttpServer(new InetSocketAddress(8099), 30);
              httpserver.createContext("/", new HlsDecryptHandler());
              httpserver.start();
              System.out.println("hls decrypt server started");
          }
          public static void main(String[] args) throws IOException {
              HlsDecryptServer server = new HlsDecryptServer();
              server.serviceBootStrap();
          }}
    • 未开启M3U8标准加密改写

      展开查看Java示例代码

      下述Java示例代码中,您需要按实际情况变更的参数如下:

      参数

      传入值

      region

      地域标识,要求KMS服务的地域和点播视频所在的地域保持一致。例如华东2(上海),填写cn-shanghai,其他地域标识请参见点播地域标识

      AccessKey

      传入阿里云账号或RAM用户的AccessKey ID和AccessKey Secret,获取方法请参见创建AccessKey

      httpserver

      根据需求选择服务启动的端口号。

      import com.aliyuncs.DefaultAcsClient;
      import com.aliyuncs.exceptions.ClientException;
      import com.aliyuncs.http.ProtocolType;
      import com.aliyuncs.profile.DefaultProfile;
      import com.aliyuncs.vod.model.v20170321.DecryptKMSDataKeyRequest;
      import com.aliyuncs.vod.model.v20170321.DecryptKMSDataKeyResponse;
      import com.sun.net.httpserver.Headers;
      import com.sun.net.httpserver.HttpExchange;
      import com.sun.net.httpserver.HttpHandler;
      import com.sun.net.httpserver.HttpServer;
      import com.sun.net.httpserver.spi.HttpServerProvider;
      import org.apache.commons.codec.binary.Base64;
      
      import java.io.IOException;
      import java.io.OutputStream;
      import java.net.HttpURLConnection;
      import java.net.InetSocketAddress;
      import java.net.URI;
      import java.util.regex.Matcher;
      import java.util.regex.Pattern;
      
      public class HlsDecryptServerNoToken {
      
          private static DefaultAcsClient client;
          static {
              //KMS的区域,必须与视频对应区域
              String region = "cn-beijing";
              //访问KMS的授权AccessKey信息
              // 阿里云账号AccessKey拥有所有API的访问权限,建议您使用RAM用户进行API访问或日常运维。
              // 强烈建议不要把AccessKey ID和AccessKey Secret保存到工程代码里,否则可能导致AccessKey泄露,威胁您账号下所有资源的安全。
              // 本示例通过从环境变量中读取AccessKey,来实现API访问的身份验证。运行代码示例前,请配置环境变量ALIBABA_CLOUD_ACCESS_KEY_ID和ALIBABA_CLOUD_ACCESS_KEY_SECRET。
              String accessKeyId = System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID");
              String accessKeySecret = System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET");
              client = new DefaultAcsClient(DefaultProfile.getProfile(region, accessKeyId, accessKeySecret));
          }
          /**
           * 说明:
           * 1、接收解密请求,获取密文密钥和令牌Token
           * 2、调用KMS decrypt接口获取明文密钥
           * 3、将明文密钥base64decode返回
           */
          public class HlsDecryptHandler implements HttpHandler {
              /**
               * 处理解密请求
               * @param httpExchange
               * @throws IOException
               */
              public void handle(HttpExchange httpExchange) throws IOException {
                  String requestMethod = httpExchange.getRequestMethod();
                  if ("GET".equalsIgnoreCase(requestMethod)) {
      
                      //从URL中取得密文密钥
                      String ciphertext = getCiphertext(httpExchange);
                      System.out.println(ciphertext);
                      if (null == ciphertext)
                          return;
                      //从KMS中解密出来,并Base64 decode
                      byte[] key = decrypt(ciphertext);
                      //设置header
                      setHeader(httpExchange, key);
                      //返回base64decode之后的密钥
                      OutputStream responseBody = httpExchange.getResponseBody();
                      responseBody.write(key);
                      responseBody.close();
                  }
              }
              private void setHeader(HttpExchange httpExchange, byte[] key) throws IOException {
                  Headers responseHeaders = httpExchange.getResponseHeaders();
                  responseHeaders.set("Access-Control-Allow-Origin", "*");
                  httpExchange.sendResponseHeaders(HttpURLConnection.HTTP_OK, key.length);
              }
              /**
               * 调用KMS decrypt接口解密,并将明文base64decode
               * @param ciphertext
               * @return
               */
              private byte[] decrypt(String ciphertext) {
      
                  DecryptKMSDataKeyRequest request = new DecryptKMSDataKeyRequest();
                  request.setCipherText(ciphertext);
                  request.setProtocol(ProtocolType.HTTPS);
                  try {
                      DecryptKMSDataKeyResponse response = client.getAcsResponse(request);
                      String plaintext = response.getPlaintext();
                      System.out.println("PlainText: " + plaintext);
                      //注意:需要base64 decode
                      return Base64.decodeBase64(plaintext);
                  } catch (ClientException e) {
                      e.printStackTrace();
                      return null;
                  }
              }
      
              /**
               * 从URL中获取密文密钥参数
               * @param httpExchange
               * @return
               */
              private String getCiphertext(HttpExchange httpExchange) {
                  URI uri = httpExchange.getRequestURI();
                  String queryString = uri.getQuery();
                  String pattern = "CipherText=(\\w*)";
                  Pattern r = Pattern.compile(pattern);
                  Matcher m = r.matcher(queryString);
                  if (m.find())
                      return m.group(1);
                  else {
                      System.out.println("Not Found CipherText Param");
                      return null;
                  }
              }
          }
      
          /**
           * 服务启动
           *
           * @throws IOException
           */
          private void serviceBootStrap() throws IOException {
              HttpServerProvider provider = HttpServerProvider.provider();
              //监听端口可以自定义,能同时接受最多30个请求
              HttpServer httpserver = provider.createHttpServer(new InetSocketAddress(8099), 30);
              httpserver.createContext("/", new HlsDecryptHandler());
              httpserver.start();
              System.out.println("hls decrypt server started");
          }
          public static void main(String[] args) throws IOException {
              HlsDecryptServerNoToken server = new HlsDecryptServerNoToken();
              server.serviceBootStrap();
          }}
      
  2. 获取视频播放地址和凭证。

    调用GetVideoPlayAuth - 获取音视频播放凭证接口获取播放凭证或调用GetPlayInfo - 获取音视频播放地址接口获取播放地址。

  3. 播放加密视频。

    HLS标准加密支持所有的HLS播放器,您可以选择使用自研的播放器或阿里云播放器进行播放加密视频。

    如果使用阿里云播放器,请按照阿里云播放器的要求获取令牌和鉴权信息后播放,详情请参见播放HLS标准加密视频-Web端。如果使用非阿里云播放器,请自行实现播放逻辑。

    使用阿里云播放器测试播放的内部流程解析如下:

    开启M3U8标准加密改写(推荐)

    流程

    • 获取M3U8文件地址后,播放器会解析M3U8文件中的EXT-X-KEY标签中的URI并访问,从而获取到带密文密钥的解密接口URI,此URI为您发起标准加密时传递的加密配置 EncryptConfig中的DecryptKeyUri参数值。

    • 只允许合法用户才可以访问,那么需要播放器在获取解密密钥时携带您承认的认证信息,认证信息可以通过MtsHlsUriToken参数传入。

    • 播放器在解析到解密地址URI时会自动请求解密接口获取解密密钥,拿到解密密钥去解密加密过的ts文件进行播放。

    示例

    • 视频的播放地址为:https://demo.aliyundoc.com/encrypt-stream****-hd.m3u8,则请求时需要携带MtsHlsUriToken参数传入

    • 最终请求地址为:https://demo.aliyundoc.com/encrypt-stream****-hd.m3u8?MtsHlsUriToken=<令牌>

    • 解密地址为:https://demo.aliyundoc.com?CipherText=ZjJmZGViNzUtZWY1Mi00Y2RlLTk3MTMtOT****

    • 最终解密请求地址为:https://demo.aliyundoc.com?CipherText=ZjJmZGViNzUtZWY1Mi00Y2RlLTk3MTMtOT****&MtsHlsUriToken=<颁发的令牌>

    未开启M3U8标准加密改写

    流程

    • 获取M3U8文件地址后,播放器会解析M3U8文件中的EXT-X-KEY标签中的URI并访问,从而获取到带密文密钥的解密接口URI,此URI为您发起标准加密时传递的加密配置 EncryptConfig中的DecryptKeyUri参数值。

    • 播放器在解析到解密地址URI时会自动请求解密接口获取解密密钥,拿到解密密钥去解密加密过的ts文件进行播放。

    示例

    • 视频的播放地址为:https://demo.aliyundoc.com/encrypt-stream****-hd.m3u8

    • 最终请求地址为:https://demo.aliyundoc.com/encrypt-stream****-hd.m3u8

    • 解密地址为:https://demo.aliyundoc.com?CipherText=ZjJmZGViNzUtZWY1Mi00Y2RlLTk3MTMtOT****

    • 最终解密请求地址为:https://demo.aliyundoc.com?CipherText=ZjJmZGViNzUtZWY1Mi00Y2RlLTk3MTMtOT****

相关文档

如何播放加密视频