const crypto = require('crypto');
var token = "Ev97wOUSAtJusc3Vsd9O2ngr_vfV****";
var screenID ="14c5448c00ecde02b065c231d165****";
var time = Date.now();
var stringToSign = screenID +'|'+ time;
var signature = crypto.createHmac('sha256', token).update(stringToSign).digest().toString('base64');
var url="http://datav.aliyuncs.com/share/"+ screenID +"?_datav_time="+time+"&_datav_signature="+ encodeURIComponent(signature);
Java:
package com.company;
import java.security.*;
import java.util.Date;
import javax.crypto.*;
import javax.crypto.spec.SecretKeySpec;
import org.apache.commons.codec.binary.Base64;
import java.net.URLEncoder;
public class TokenTest {
public static String getSignedUrl(String screenID, String token){
Date date = new Date();
Long time = date.getTime();
String stringToSign = screenID + "|" + time;
String signature = HMACSHA256(stringToSign.getBytes(), token.getBytes());
String url = "http://datav.aliyuncs.com/share/"+ screenID +"?_datav_time="+time+"&_datav_signature="+ signature;
return url;
}
/**
* 使用java原生的摘要实现SHA256加密。
* @param str加密后的报文。
* @return
*/
public static String HMACSHA256(byte[] data, byte[] key)
{
try {
SecretKeySpec signingKey = new SecretKeySpec(key, "HmacSHA256");
Mac mac = Mac.getInstance("HmacSHA256");
mac.init(signingKey);
return URLEncoder.encode(byte2Base64(mac.doFinal(data)));
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (InvalidKeyException e) {
e.printStackTrace();
}
return null;
}
private static String byte2Base64(byte[] bytes){
return Base64.encodeBase64String(bytes);
}
public static void main(String[] args) throws Exception {
System.out.println(getSignedUrl("screenId", "token"));
}
}
C#:
using System;
using System.Security.Cryptography;
using System.Text.RegularExpressions;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Text;
namespace datavToken
{
class Program
{
static void Main(string[] args)
{
var dic = new Dictionary<string, string>(); // 自定义参数。
dic.Add("datav_sign_no", "123998"); // datav_sign_开头,需要签名。
dic.Add("datav_sign_lo", "kk");
dic.Add("datav_sign_ao", "xx");
dic.Add("name", "123"); // 不需要签名。
// 分享页前缀,屏幕分享id、token,自定义参数字典。
Console.WriteLine(GenerateUrl("https://datav.aliyun.com/share/", "ca74bea5e45503070d607795e0****", "66DsL2qjrXRHluSJScv_flOUhn****", dic));
}
private static string GenerateUrl(string datavBase, string screenId, string token, Dictionary<string, string> customeParams)
{
string pattern = @"^datav_sign_.*";
string timestamp = GetTimeStamp();
// 参数排序。
Dictionary<string, string>.KeyCollection keyCol = customeParams.Keys;
List<string> signKeys = new List<string>();
foreach (var item in keyCol.ToList())
{
if (Regex.IsMatch(item, pattern))
{
signKeys.Add(item);
}
}
// 按照key排序。
signKeys = signKeys.OrderBy(k => k).ToList();
string paramsSignStr = signKeys.Aggregate("", (total, key) =>
{
if (total != "")
{
total += "&";
}
total += key + "=" + customeParams[key];
return total;
});
//不存在参数认证
string signStr = screenId + "|" + timestamp;
//存在参数认证
//string signStr = screenId + "|" + timestamp + "|" + paramsSignStr;
var encoding = new System.Text.ASCIIEncoding();
byte[] keyByte = encoding.GetBytes(token);
byte[] messageBytes = encoding.GetBytes(signStr);
string signature;
using (var hmacsha256 = new HMACSHA256(keyByte))
{
byte[] hashmessage = hmacsha256.ComputeHash(messageBytes);
signature = Convert.ToBase64String(hashmessage);
}
var paramDic = new Dictionary<string, string>();
paramDic.Add("_datav_time", timestamp);
paramDic.Add("_datav_signature", signature);
foreach (var item in customeParams)
{
paramDic.Add(item.Key, item.Value);
}
return datavBase + screenId + "?" + ParseToString(paramDic);
}
public static string GetTimeStamp()
{
TimeSpan ts = DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, 0);
return Convert.ToInt64(ts.TotalMilliseconds).ToString();
}
static public string ParseToString(IDictionary<string, string> parameters)
{
IDictionary<string, string> sortedParams = new SortedDictionary<string, string>(parameters);
IEnumerator<KeyValuePair<string, string>> dem = sortedParams.GetEnumerator();
StringBuilder query = new StringBuilder("");
while (dem.MoveNext())
{
string key = dem.Current.Key;
string value = dem.Current.Value;
if (!string.IsNullOrEmpty(key) && !string.IsNullOrEmpty(value))
{
query.Append(key).Append("=").Append(HttpUtility.UrlEncode(value)).Append("&");
}
}
string content = query.ToString().Substring(0, query.Length - 1);
return content;
}
}
}