阿里云视频直播API签名机制源码

本文展示:通过代码实现下阿里视频直播签名处理规则

阿里云视频直播签名机制,官方文档链接:https://help.aliyun.com/document_detail/50286.html?spm=a2c4g.11186623.2.11.2a053653zSTuUw#concept-50286-zh

官方文档说明如下:

您在访问时,需要按照下面的方法对请求进行签名处理。

  1. 使用请求参数构造规范化的请求字符串(Canonicalized Query String)。
    1. 参数排序。

      按照参数名称的字典顺序对请求中所有的请求参数(包括“公共请求参数”和接口的自定义参数,但不包括“公共请求参数”中的 Signature 参数)进行排序。

      说明 当使用 GET 方法提交请求时,这些参数就是请求 URI 中的参数部分(即 URI 中“?”之后由“&”连接的部分)。
    2. 参数编码。
      对排序之后的请求参数的名称和值分别用 UTF-8 字符集进行 URL 编码。编码的规则如下。

      • 对于字符 A~Z、a~z、0~9 以及字符“-”、“_”、“.”、“~”不编码;

      • 对于其它字符编码成 %XY 的格式,其中 XY 是字符对应 ASCII 码的 16 进制表示。比如英文的双引号(”)对 应的编码为 %22

      • 对于扩展的 UTF-8 字符,编码成 %XY%ZA… 的格式;

      • 英文空格( )要编码成 %20,而不是加号(+)。

        该编码方式和一般采用的 application/x-www-form-urlencoded MIME 格式编码算法(比如 Java 标准库中的 java.net.URLEncoder 的实现)相似,但又有所不同。实现时,可以先用标准库的方式进行编码,然后把编码后的字符串中加号(+)替换成 %20、星号(*)替换成 %2A%7E 替换回波浪号(~),即可得到上述规则描述的编码字符串。这个算法可以用下面的 percentEncode 方法来实现:

        private static final String ENCODING = "UTF-8";
        
        private static String percentEncode(String value) throws UnsupportedEncodingException {
        return value != null ? URLEncoder.encode(value, ENCODING).replace("+", "%20").replace("*", "%2A").replace("%7E", "~") : null;
        }
    3. 将编码后的参数名称和值用英文等号(=)进行连接。
    4. 将等号连接得到的参数组合按步骤 i 排好的顺序依次使用“&”符号连接,即得到规范化请求字符串。
  2. 将上一步构造的规范化字符串按照下面的规则构造成待签名的字符串。
    StringToSign=
    HTTPMethod + “&” +
    percentEncode(“/”) + ”&” +
    percentEncode(CanonicalizedQueryString)
    其中:

    • HTTPMethod 是提交请求用的 HTTP 方法,比如 GET。

    • percentEncode(“/”) 是按照步骤 1.ii 中描述的 URL 编码规则对字符 “/” 进行编码得到的值,即 %2F。

    • percentEncode(CanonicalizedQueryString) 是对步骤 1 中构造的规范化请求字符串按步骤 1.ii 中描述的 URL 编码规则编码后得到的字符串。

  3. 按照 RFC2104 的定义,计算待签名字符串 StringToSign 的 HMAC 值。
    说明 计算签名时使用的 Key 就是您持有的 Access Key Secret 并加上一个 “&” 字符(ASCII:38),使用的哈希算法是 SHA1。
  4. 按照 Base64 编码规则把上面的 HMAC 值编码成字符串,即得到签名值(Signature)。
  5. 将得到的签名值作为 Signature 参数添加到请求参数中,即完成对请求签名的过程。说明 得到的签名值在作为最后的请求参数值提交给视频直播服务器的时候,要和其他参数一样,按照 RFC3986的规则进行 URL 编码)。

根据官方文档,源码实现如下:

  
 
package com.hs.common.alilive;

import sun.misc.BASE64Encoder;

import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.text.SimpleDateFormat;
import java.util.*; public class AliLiveSignatureUtil { public static final String Format = "JSON";
public static final String VERSION = "2016-11-01";
public static final String AccessKeyId = "testkey";//填写你的key
public static final String AccessKeySecret = "testsecret";//填写你的Secret
// public static final String Signature = "";
public static final String SignatureMethod = "HMAC-SHA1";
// public static final String Timestamp = getUTCTimeStr();
public static final String SignatureVersion = "1.0";
// public static final String SignatureNonce = RandomStringUtils.randomAlphanumeric(12); private static final String ISO8601_DATE_FORMAT = "yyyy-MM-dd'T'HH:mm:ss'Z'"; //1-根据请求参数Map获取签名
public static String getSignatureFromParam(Map<String,String> paramMap) {
//Map<String,String> paramMap封装了具体api的私有参数和公有参数,key和value
     String signature = "";
try {
final String SEPARATOR = "&";
//1-获取请求参数构造规范化的请求字符串(Canonicalized Query String)
//1-1-对参数进行排序
String[] sortedKeys = (String[]) paramMap.keySet().toArray(new String[]{});
Arrays.sort(sortedKeys);
//1-2-参数编码、参数名称和值用英文等号(=)进行连接、使用“&”符号连接,即得到规范化请求字符串,
//这里将参数编码、英文等号(=)连接、使用“&”符号连接三步一起放在循环里面进行操作
StringBuilder canonicalizedQueryString = new StringBuilder();
for (String key : sortedKeys) {
canonicalizedQueryString.append("&").append(percentEncode(key))
.append("=").append(percentEncode((String) paramMap.get(key)));
} //2-将上一步构造的规范化字符串按照下面的规则构造成待签名的字符串(注意percentEncode的使用)。
//HTTPMethod 是提交请求用的 HTTP 方法,比如 GET。
//percentEncode(“/”) 是按照步骤 1.ii 中描述的 URL 编码规则对字符 “/” 进行编码得到的值,即 %2F。
//percentEncode(CanonicalizedQueryString) 是对步骤 1 中构造的规范化请求字符串按步骤 1.ii 中描述的 URL 编码规则编码后得到的字符串。
StringBuilder stringToSign = new StringBuilder();
stringToSign.append("GET").append(SEPARATOR).append(percentEncode("/")).append(SEPARATOR);
stringToSign.append(percentEncode(canonicalizedQueryString.toString()
.substring(1)));
System.out.println(stringToSign); //3- 按照 RFC2104 的定义,计算待签名字符串 StringToSign 的 HMAC 值。
//计算签名时使用的 Key 就是您持有的 Access Key Secret 并加上一个 “&” 字符(ASCII:38),使用的哈希算法是 SHA1。()
//final String ALGORITHM = "HMAC-SHA1";//注意使用HMAC-SHA1会报错,要用HmacSHA1(但是我看的参考博客用的是“HMAC-SHA1”)
final String ALGORITHM = "HmacSHA1";
final String ENCODING = "UTF-8";
String key = AccessKeySecret + "&";
Mac mac = Mac.getInstance(ALGORITHM);
mac.init(new SecretKeySpec(key.getBytes(ENCODING), ALGORITHM));
byte[] signData = mac.doFinal(stringToSign.toString().getBytes(ENCODING)); //4-按照 Base64 编码规则把上面的 HMAC 值编码成字符串,即得到签名值(Signature)。
signature = new String(new BASE64Encoder().encode(signData));
signature = percentEncode(signature);
} catch (InvalidKeyException e) {
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (IllegalStateException e) {
e.printStackTrace();
}
return signature;
} //1-1-转码
private static String percentEncode(String value) throws UnsupportedEncodingException {
return value != null ? URLEncoder.encode(value, "utf-8").replace("+", "%20").replace("*", "%2A").replace("%7E", "~") : null; } //1-2-获取时间
private static String getUTCTimeStr() {
//1、取得本地时间:
final Calendar cal = Calendar.getInstance();
System.out.println(cal.getTime());
//2、取得时间偏移量:
final int zoneOffset = cal.get(Calendar.ZONE_OFFSET);
System.out.println(zoneOffset);
//3、取得夏令时差:
final int dstOffset = cal.get(Calendar.DST_OFFSET);
System.out.println(dstOffset);
//4、从本地时间里扣除这些差量,即可以取得UTC时间:
cal.add(Calendar.MILLISECOND, -(zoneOffset + dstOffset));
SimpleDateFormat df = new SimpleDateFormat(ISO8601_DATE_FORMAT);
return df.format(cal.getTime());
}
}

参考资料:

1-https://blog.csdn.net/u010904352/article/details/53737625

阿里云视频直播API签名机制源码的更多相关文章

  1. 阿里云视频直播PHP-SDK

    阿里云 视频直播 配置 及 PHP-SDK 接入教程准备工作域名管理配置鉴权地址生成器及DEMO演示-熟悉鉴权接入SDK推流回调的配置阿里云 视频直播 配置 及 PHP-SDK 接入教程 个人感觉,阿 ...

  2. 阿里云视频直播PHP-SDK接入教程

    阿里云视频直播PHP-SDK接入教程 阿里云 视频直播 配置 及 PHP-SDK 接入教程        准备工作        域名管理        配置鉴权        地址生成器及DEMO演 ...

  3. H264音视频直播系统 服务器端+客户端源码 可用于直播系统搭建

    RTP协议实现直播系统搭建,采用H.264和AAC编码,码率极低,同时有较高的视频清晰度和音频音质,可用于视频聊天.视频会议.摄像头监控等多种应用场景. 直播系统搭建发布端,选择视频和音频设备,指定服 ...

  4. 仿阿里云后台管理界面模板html源码——后台

    链接:http://pan.baidu.com/s/1nuH2SPj 密码:ar8o

  5. 五:用JAVA写一个阿里云VPC Open API调用程序

    用JAVA写一个阿里云VPC Open API调用程序 摘要:用JAVA拼出来Open API的URL 引言 VPC提供了丰富的API接口,让网络工程是可以通过API调用的方式管理网络资源.用程序和软 ...

  6. 阿里云视频云正式支持AV1编码格式 为视频编码服务降本提效

    今天我们要说的 AV1 可不是我们平时说的 .AVI 文件格式,它是由AOM(Alliance for Open Media,开放媒体联盟)制定的一个开源.免版权费的视频编码格式,可以解决H.265昂 ...

  7. 直播带货APP源码开发为什么选择云服务器

    云服务器可以为直播带货APP源码提供弹性计算以及更高的运行效率,避免资源浪费,随着直播带货APP源码业务需求的变化,可以实时扩展或缩减计算资源.CVM支持按实际使用的资源计费,可以节约计算成本. 一. ...

  8. 实时 + 高清 + 超压缩,阿里云视频云发布业内首款 VVC 编码器 Ali266

    基于新一代国际视频编解码标准 H.266/VVC,阿里云视频云近日发布了实时高清编码器 Ali266,有力推动 H.266/VVC 标准应用的落地,真正开启 H.266/VVC 的商用之路,并强力赋能 ...

  9. 阿里云视频云 Retina 多媒体 AI 体验馆开张啦!

    带你体验视频更多可能 海量视频管理难度大?翻库检索特定人物费时费力?视频内容剪辑效率低?您的得力助手"Retina多媒体AI"体验馆已上线.带你感受视频AI黑科技,开启极致智能体验 ...

随机推荐

  1. WDA-Webdynpro应用发布至EP

    主要是记录下Webdynpro应用发布到EP端的整个操作过程. 1.系统管理System Administration 定义与后台应用系统R3的连接 1.1设置连接参数 路径:System Admin ...

  2. 使用CommandLineRunner或ApplicationRunner接口创建bean

    在spring boot应用中,我们可以在程序启动之前执行任何任务.为了达到这个目的,我们需要使用CommandLineRunner或ApplicationRunner接口创建bean,spring ...

  3. 自己写一个spring boot starter

    https://blog.csdn.net/liuchuanhong1/article/details/55057135

  4. CTags配好后仍找不到函数定义的问题

    若把CTags的Setting-User配好后,Navigation to Defination一个类或者函数发现仍无法跳转时,可以把需要查找的文件夹拉进sublime任一窗口中再试试. 因为CTag ...

  5. javascript原型链中 this 的指向

    为了弄清楚Javascript原型链中的this指向问题,我写了个代码来测试: var d = { d: 40 }; var a = { x: 10, calculate: function (z) ...

  6. 如何配置eclipse的安卓SDK下载目录

    首先,打开eclipse,主界面如图 2 点击Windows下的preference 3 然后在出现的对话框中选择“android” 4 然后我们就能看到的主界面,在这里输入android sdk的目 ...

  7. List,Set,Map集合的遍历方法

    List的三种实现:ArrayList(数组)  LinkedList(链表)  Vector(线程安全) List集合遍历方法: List<String> list = new Arra ...

  8. Nginx深度优化

    简介 1.隐藏版本号2.修改Nginx用户与组3.配置Nginx网页缓存时间4.实现Nginx的日志切割5.配置Nginx实现连接超时6.更改进程数7.配置Nginx实现网页压缩功能8.配置Nginx ...

  9. oracle 连接池参数

    后来排查出数据库监听异常,发现是ORA-12519拒绝错误.后来发现是数据的连接池达到的极致. 具体解决方案如下: --首先检查process和session的使用情况,在sqlplus里面查看. S ...

  10. 微信小程序生命周期——小程序的生命周期及页面的生命周期。

    最近在做微信小程序开发,也发现一些坑,分享一下自己踩过的坑. 生命周期是指一个小程序从创建到销毁的一系列过程. 在小程序中 ,通过App()来注册一个小程序 ,通过Page()来注册一个页面. 首先来 ...