接口签名算法
更新时间: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
package main
import (
"github.com/google/uuid"
"time"
"crypto/hmac"
"crypto/sha256"
)
//AK,SK为接入时分配的APPID及秘钥,接入方根据实际情况改变取值
//重要:不要在客户端暴露SK,否则有信息泄露等一系列安全风险
ak := "lf2a69d4dff7dc9f3a462719da8bb943";
sk := "yf4xqjv0bspsrlzh2hq6yxibqauvaciq";
//nonce跟据业务实际情况指定
nonce := uuid.New().String()
//时间戳为精确到秒,故JAVA需要转换
timestamp := time.Now().Unix()
signType := "HMAC-SHA256";
contentMd5 := "57e37568a871d537d25cd19a9dc10cb7";
//此种拼接效率效低,这里为了更好的展示,故采用字符串相加方式,业务式可根据自己的需求调整算法
joinedString := ak + "&" + timestamp + "&" + nonce + "&" + signType + "&" + contentMd5
//以sk为密钥进行hmac_sha256加密,业务方可自行选择类库,这里只列出一种方式
keys := []byte(sk)
h := hmac.New(sha256.New,keys)
h.Write([]byte(joinedString))
sign := hex.EncodeToString(h.Sum(nil))
java
//AK,SK为接入时分配的APPID及秘钥,接入方根据实际情况改变取值
//重要:不要在客户端暴露SK,否则有信息泄露等一系列安全风险
String ak = "lf2a69d4dff7dc9f3a462719da8bb943";
String sk = "yf4xqjv0bspsrlzh2hq6yxibqauvaciq";
//nonce跟据业务实际情况指定
String nonce = UUIDGenerator.getUUID();
String timestamp = String.valueOf(date.getTime()/1000);
String signType = "HMAC-SHA256";
String contentMd5 = "57e37568a871d537d25cd19a9dc10cb7";
//此种拼接效率效低,这里为了更好的展示,故采用字符串相加方式,业务式可根据自己的需求调整算法
String joinedString = ak + "&" + timestamp + "&" + nonce + "&" + signType + "&" + contentMd5
//以sk为密钥进行hmac_sha256加密,业务方可自行选择类库,这里只列出一种方式
ac sha256_HMAC = Mac.getInstance("HmacSHA256");
SecretKeySpec secret_key = new SecretKeySpec(key.getBytes(StandardCharsets.UTF_8), "HmacSHA256");
sha256_HMAC.init(sk);
byte[] array = sha256_HMAC.doFinal(data.getBytes(StandardCharsets.UTF_8));
StringBuilder sb = new StringBuilder();
for (byte item : array) {
sb.append(Integer.toHexString((item & 0xFF) | 0x100).substring(1, 3));
}
String sign = sb.toString();
php
//AK,SK为接入时分配的APPID及秘钥,接入方根据实际情况改变取值
//重要:不要在客户端暴露SK,否则有信息泄露等一系列安全风险
$ak = "lf2a69d4dff7dc9f3a462719da8bb943";
$sk = "yf4xqjv0bspsrlzh2hq6yxibqauvaciq";
//nonce跟据业务实际情况指定
$nonce = com_create_guid();
$timestamp = time();
$signType = "HMAC-SHA256";
$contentMd5 = "57e37568a871d537d25cd19a9dc10cb7";
$joinedString = $ak ."&" . $timestamp . "&" . $nonce . "&" . $signType . "&" . $contentMd5
$sign = hash_hmac('sha256',$joinedString, $sk);