API文档

调用方式 签名方法

签名方法

最近更新时间:2020-10-15 16:24:49

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
&timestamp=1521005892

最终字符串
apiKey=c7722149110b7492a2e5cf1d8f3f966b&domain=dns.com
&timestamp=1521005892ecb4ff0e877a83292b9f35067e9ae673

生成签名串

使用签名算法(MD5)对上一步中获得的 最终字符串 进行签名,即可获得最终的签名串。

具体代码如下,以 PHP 语言为例,由于本例中所用的签名算法为 MD5,因此生成签名串的代码如下(使用其它程序设计语言开发时,可用上述示例中的原文字符串进行签名验证,得到的签名串与例子中的一致即可):

$lastStr = 'apiKey=c7722149110b7492a2e5cf1d8f3f966b&domain=dns.com
&timestamp=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();
        }
    }
}