接口签名算法
更新时间:2023-05-05
算法描述
需要用的字段需关注前一章“接口请求说明”中的“HEADER”要求,即以下内容:
名称 | 类型 | 说明 | 示例值 |
---|---|---|---|
X_BXEO_APP_ID | string | AK值,BXEO系统为每个应用分配的唯一标识 | lf2a69d4dff7dc9f3a462719da8bb943 |
X_BXEO_NONCE | string | 每次请求的唯一标识,由应用自己生成并传入,BXEO会根据nonce的值阻止重入请求 | a1651028088 |
X_BXEO_SIGN | string | 本次请求的签名,签名算法见下文 | dc43920e163fe8423ee512418a3880aae05bf0d00997a58f185f49f4fe77a13f |
X_BXEO_TIMESTAMP | string | 本次请求时间戳。格式为UNIX时间戳,即:从1970年1月1日(UTC/GMT的午夜)开始所经过的秒数,不考虑闰秒 | 1651028088 |
X_BXEO_CONTENTMD5 | string | 本次请求body中原文的md5,具体算法见下文 | 57e37568a871d537d25cd19a9dc10cb7 |
X_BXEO_SIGNTYPE | string | 固定传入HMAC-SHA256 | HMAC-SHA256 |
将上述内容,以X_BXEO_APP_ID, X_BXEO_TIMESTAMP, X_BXEO_NONCE, X_BXEO_SIGNTYPE,X_BXEO_CONTENTMD5的顺序(不包括X_BXEO_SIGN),拼接成value1&value2&value3...形式的字符串str(强语言类注意类型转换),以上面表格中的示例值为例,最终拼成的字符串为 :
lf2a69d4dff7dc9f3a462719da8bb943&1651028088&a1651028088&HMAC-SHA256&57e37568a871d537d25cd19a9dc10cb7
将上述字符串以分配给应用的密钥SK ,进行hmac-sha256加密后的结果,即为最终签名的值 将该签名值赋值给header中的X_BXEO_SIGN字段后便可正常调用接口。
各语言DEMO
golang
Plain Text
1package main
2import (
3 "github.com/google/uuid"
4 "time"
5 "crypto/hmac"
6 "crypto/sha256"
7)
8//AK,SK为接入时分配的APPID及秘钥,接入方根据实际情况改变取值
9//重要:不要在客户端暴露SK,否则有信息泄露等一系列安全风险
10ak := "lf2a69d4dff7dc9f3a462719da8bb943";
11sk := "yf4xqjv0bspsrlzh2hq6yxibqauvaciq";
12//nonce跟据业务实际情况指定
13nonce := uuid.New().String()
14//时间戳为精确到秒,故JAVA需要转换
15timestamp := time.Now().Unix()
16signType := "HMAC-SHA256";
17contentMd5 := "57e37568a871d537d25cd19a9dc10cb7";
18//此种拼接效率效低,这里为了更好的展示,故采用字符串相加方式,业务式可根据自己的需求调整算法
19joinedString := ak + "&" + timestamp + "&" + nonce + "&" + signType + "&" + contentMd5
20
21//以sk为密钥进行hmac_sha256加密,业务方可自行选择类库,这里只列出一种方式
22keys := []byte(sk)
23h := hmac.New(sha256.New,keys)
24h.Write([]byte(joinedString))
25
26sign := hex.EncodeToString(h.Sum(nil))
java
Plain Text
1//AK,SK为接入时分配的APPID及秘钥,接入方根据实际情况改变取值
2//重要:不要在客户端暴露SK,否则有信息泄露等一系列安全风险
3String ak = "lf2a69d4dff7dc9f3a462719da8bb943";
4String sk = "yf4xqjv0bspsrlzh2hq6yxibqauvaciq";
5//nonce跟据业务实际情况指定
6String nonce = UUIDGenerator.getUUID();
7
8String timestamp = String.valueOf(date.getTime()/1000);
9String signType = "HMAC-SHA256";
10String contentMd5 = "57e37568a871d537d25cd19a9dc10cb7";
11//此种拼接效率效低,这里为了更好的展示,故采用字符串相加方式,业务式可根据自己的需求调整算法
12String joinedString = ak + "&" + timestamp + "&" + nonce + "&" + signType + "&" + contentMd5
13
14//以sk为密钥进行hmac_sha256加密,业务方可自行选择类库,这里只列出一种方式
15ac sha256_HMAC = Mac.getInstance("HmacSHA256");
16SecretKeySpec secret_key = new SecretKeySpec(key.getBytes(StandardCharsets.UTF_8), "HmacSHA256");
17sha256_HMAC.init(sk);
18byte[] array = sha256_HMAC.doFinal(data.getBytes(StandardCharsets.UTF_8));
19StringBuilder sb = new StringBuilder();
20for (byte item : array) {
21 sb.append(Integer.toHexString((item & 0xFF) | 0x100).substring(1, 3));
22}
23String sign = sb.toString();
php
Plain Text
1//AK,SK为接入时分配的APPID及秘钥,接入方根据实际情况改变取值
2//重要:不要在客户端暴露SK,否则有信息泄露等一系列安全风险
3$ak = "lf2a69d4dff7dc9f3a462719da8bb943";
4$sk = "yf4xqjv0bspsrlzh2hq6yxibqauvaciq";
5//nonce跟据业务实际情况指定
6$nonce = com_create_guid();
7$timestamp = time();
8$signType = "HMAC-SHA256";
9$contentMd5 = "57e37568a871d537d25cd19a9dc10cb7";
10$joinedString = $ak ."&" . $timestamp . "&" . $nonce . "&" . $signType . "&" . $contentMd5
11$sign = hash_hmac('sha256',$joinedString, $sk);