签名生成
更新时间:2020-08-20
准备
在进行下面的步骤之前,需要先获取live_app_key
与live_app_secret
两个字符串。
- 确保从开发者平台得到的
app_id
及app_secret
(server版本)的正确性及完整性 - 使用 动态链接库(0.0.4) 进行解密获得
live_app_key
及live_app_secret
c 头文件
#ifndef DECRYPT_LIBRARY_H
#define DECRYPT_LIBRARY_H
#include <stdint.h>
char *decrypt(char *appID, char *cipherText);
void release(char *plainText);
#endif //DECRYPT_LIBRARY_H
构造签名串
请按照当前文档约定的规则 构造签名串
。
LinkV会使用同样的方式构造签名串,如果接入方构造签名串的方式错误,将导致签名验证不通过
。
下面先说明签名串的具体格式:
cmimtoken
串是一个32位长度的字符串。
sign
串是一个40位长度的字符串。
计算签名值
cmimtoken 签名计算
- 拼接字符串(原串)
设所有发送或者接收到的数据为集合
M
,将集合M内非空参数值的参数的值按照ASCII
码从小到大排序(字典序)(即value1value2…),拼接成字符串stringA。
参数名ASCII码从小到大排序(字典序)
假设传送的参数如下:
appSecret="a8797322c9067852fec8309fa256c339"
timestamp ="1597141347"
nonce ="84469366"
按照参数的值按照ASCII字典序排序如下:
1597141347
84469366
a8797322c9067852fec8309fa256c339
StringA = "159714134784469366a8797322c9067852fec8309fa256c339"
- 生成签名串
签名校验算法为
md5
,转为小写,生成cmimtoken
签名
假设原串如下:
StringA = "159714134784469366a8797322c9067852fec8309fa256c339"
生成cmimtoken签名
cmimtoken = Tolower(md5(StringA)) = "0b45ae8ee88db1cee3f9f4fa1d9d3276"
sign 签名计算
- 拼接字符串(原串)
将
appId
,appKey
,timestamp
,nonce
通过 "|" 竖号字符连接,通过SHA-1
散列后的字符串 ,转为大写
假设传送的参数如下:
appId="linkv"
appKey="2q3f9i"
timestamp ="1597141347"
nonce ="84469366"
- 生成签名串
签名校验算法为sha-1
,转为大写,生成sign
签名
假设原串如下:
StringA = "linkv|2q3f9i|1597141347|84469366"
生成sign签名
sign = Toupper(hex(sha1(StringA))) = "E28F778E4FB130C115EDCBC2E444CA5DB817724D"
示例代码
Go
...
func genRandomString(nLen int) string {
var container string
var str = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890"
b := bytes.NewBufferString(str)
length := b.Len()
bigInt := big.NewInt(int64(length))
for i := 0; i < nLen; i++ {
randomInt, _ := rand.Int(rand.Reader, bigInt)
container += string(str[randomInt.Int64()])
}
return container
}
func genGUID() string {
return genRandomString(9) + "-" + genRandomString(4) + "-" + genRandomString(4) + "-" + genRandomString(12)
}
func getTimestampS() string {
t := time.Now()
return strconv.FormatInt(t.Unix(), 10)
}
...
func ...(...) {
...
nonce := genGUID()
timestamp := getTimestampS()
arr := []string{nonce, timestamp, o.GetConfig().AppSecret}
sort.Strings(arr)
md5Data := md5.Sum([]byte(strings.Join(arr, "")))
cmimToken := strings.ToLower(hex.EncodeToString(md5Data[:]))
sha1Data := sha1.Sum([]byte(o.GetConfig().AppID + "|" + o.GetConfig().AppKey + "|" + timestamp + "|" + nonce))
sign := strings.ToUpper(hex.EncodeToString(sha1Data[:]))
...
}