1.签名方法
DNS API会对每个访问的请求进行身份验证,即每个请求都需要在公共请求参数中包含签名信息(hash),以验证用户身份。签名信息由用户所执有的安全凭证生成,安全凭证包括 apiKey 和 apiSecret,若用户还没有安全凭证,则需要在帝恩思官网上自主申请,否则无法调用云 API 接口。
2.申请安全凭证
在第一次使用帝恩思 API 之前,用户需要在 帝恩思 设置中心 > API密钥管理 上查看安全凭证。安全凭证包括 apiKey 和 apiSecret,其中:
apiKey:用于标识 API 调用者身份;
apiSecret:用于加密签名字符串和服务器端验证签名字符串的密钥。
3.生成签名串
有了安全凭证 apiKey 和 apiSecret 后,就可以生成签名串了。生成签名串的详细过程如下:
对参数排序
首先对所有请求参数按参数名做字典序升序排列。(所谓字典序升序排列,直观上就如同在字典中排列单词一样排序,按照字母表或数字表里递增顺序的排列次序,即先考虑第一个“字母”,在相同的情况下考虑第二个“字母”,依此类推。)您可以借助编程语言中的相关排序函数来实现这一功能,如 php 中的 ksort 函数。上述示例参数的排序结果如下:
{
"apiKey":"c7722149110b7492a2e5cf1d8f3f966b",
"domain":"dns.com",
"timestamp":"1521005892"
}
使用其它程序设计语言开发时, 可对上面示例中的参数进行排序,得到的结果一致即可。
拼接字符串
将把上一步排序好的请求参数格式化成“参数名称”=“参数值”的形式,如对 domain 参数,其参数名称为"domain",参数值为"dns.com",因此格式化后就为 domain=dns.com,并且把 apiSecret 拼接到字符串的最后。
apiSecret=ecb4ff0e877a83292b9f35067e9ae673
请求字符串
apiKey=c7722149110b7492a2e5cf1d8f3f966b&domain=dns.com
×tamp=1521005892
最终字符串
apiKey=c7722149110b7492a2e5cf1d8f3f966b&domain=dns.com
×tamp=1521005892ecb4ff0e877a83292b9f35067e9ae673
生成签名串
使用签名算法(MD5)对上一步中获得的 最终字符串 进行签名,即可获得最终的签名串。
具体代码如下,以 PHP 语言为例,由于本例中所用的签名算法为 MD5,因此生成签名串的代码如下(使用其它程序设计语言开发时,可用上述示例中的原文字符串进行签名验证,得到的签名串与例子中的一致即可):
$lastStr = 'apiKey=c7722149110b7492a2e5cf1d8f3f966b&domain=dns.com
×tamp=1521005892';
$signStr = md5($lastStr . 'ecb4ff0e877a83292b9f35067e9ae673');
echo $signStr;
最终得到的签名串为:
0eb4933a634000ce215370683d6f1338
4.签名DEMO
PHP
/**
* 签名方法
* @param $parameters
* @param $apiSecret
* @return string
*/
function getHash($parameters,$apiSecret){
ksort($parameters);
$hashString = '';
foreach($parameters as $key => $value){
$hashString .= ($hashString ? '&' : '') . $key . '=' . $value;
}
return md5($hashString . $apiSecret);;
}
$parameters = [
'domain' => 'dns.com',
'timestamp' => time(),
'apiKey' => 'your api_key'
];
echo getHash($parameters,'your api_secret');
GO
package main
import (
"crypto/md5"
"encoding/hex"
"fmt"
"sort"
)
func GetHash(param map[string]string, secert string) string {
var keyList []string
for k, _ := range param {
keyList = append(keyList, k)
}
sort.Strings(keyList)
var hashString string
for _, key := range keyList {
if hashString == "" {
hashString += key + "=" + param[key]
} else {
hashString += "&" + key + "=" + param[key]
}
}
m := md5.New()
m.Write([]byte(hashString + secert))
cipherStr := m.Sum(nil)
return hex.EncodeToString(cipherStr)
}
func main() {
var param = map[string]string{}
param["domain"] = "dns.com"
param["timestamp"] = "1602734019"
param["apiKey"] = "your api_key"
fmt.Println(GetHash(param, "your api_secret"))
}
Python
import hashlib
def GetHash(param, secert):
hasString = ""
for key in sorted(param):
if hasString == "":
hasString = key + "=" + param[key]
else:
hasString += "&" + key + "=" + param[key]
hasString = hasString + secert
signStr = hasString.encode(encoding='utf-8')
sign = hashlib.md5(signStr).hexdigest()
return sign
if __name__ == '__main__':
param = {"domain": "dns.com", "timestamp": "1602734019","apiKey": "your api_key"}
print(GetHash(param, "your api_secret"))
Java
package com.dns;
import java.io.UnsupportedEncodingException;
import java.math.BigInteger;
import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.*;
public class App {
public static String GetHash(Map<String, String> param , String secert) throws NoSuchAlgorithmException{
Object[] keyList = param.keySet().toArray();
Arrays.sort(keyList);
String hashString = "";
for (int i = 0; i < keyList.length; i++) {
String key = keyList[i].toString();
if (hashString == "") {
hashString += key + "=" + param.get(key);
}else{
hashString += "&" + key + "=" + param.get(key);
}
param.get(keyList[i]);
}
hashString += secert;
try {
MessageDigest md5 = MessageDigest.getInstance("MD5");
md5.update(StandardCharsets.UTF_8.encode(hashString));
return String.format("%032x", new BigInteger(1, md5.digest()));
}catch (Exception e) {
throw e;
}
}
public static void main(String[] args) {
Map param = new HashMap<String, String>();
param.put("domain","dns.com");
param.put("timestamp","1602734019");
param.put("apiKey","your api_key");
String rsp = "";
try {
rsp = GetHash(param,"your api_secret");
}catch (Exception e){ }
System.out.println(rsp);
}
}
C#(csharp)
using System;
using System.Collections.Generic;
using System.Security.Cryptography;
using System.Text;
namespace checksum
{
class MD5Hash
{
public static string GetHash(Dictionary<string, string> param, string apiSecret)
{
var keyList = new List<string>();
foreach (var item in param)
{
keyList.Add(item.Key);
}
keyList.Sort(StringComparer.Ordinal);
string hashString = "";
foreach (var key in keyList)
{
if (hashString == "")
{
hashString += key + "=" + param[key];
}
else
{
hashString += "&" + key + "=" + param[key];
}
}
return MD5Hash.createMD5(hashString + apiSecret);
}
public static string createMD5(string input)
{
MD5 md5 = MD5.Create();
byte[] inputBytes = Encoding.ASCII.GetBytes(input);
byte[] hashBytes = md5.ComputeHash(inputBytes);
StringBuilder sb = new StringBuilder();
for (int i = 0; i < hashBytes.Length; i++)
{
sb.Append(hashBytes[i].ToString("X2"));
}
return sb.ToString().ToLower();
}
}
}