2 鉴权与签名算法

2.1 鉴权参数

属性 类型 约束 描述 举例说明
appkey string 必填 应用ID, 厂商分配
nonce string 必填 随机字符串,自定义字符串 uincall
timestamp string 必填 时间戳,格式为unix整数时间戳,精确到秒 如:1603123200
signature string 必填 签名

鉴权参数包含在http路由查询参数中,示例如下:

/api/v1/aicall/task/save?appkey=[appkey]&nonce=[nonce]&timestamp=[timestamp]&signature=[signature]

2.2 签名算法

signature (数据签名)计算方法:
1) 将appkey、nonce、timestamp等参数和其值,形成key=val格式字符串组;
2) 基于key升序排序,中间拼接&字符,形成字符串:

appkey=[appkey]&nonce=[nonce]&timestamp=[timestamp];

3) 用HMAC-SHA256签名算法进行签名, 其中签名密钥appsecret由厂商分配。

2.3 代码参考

java签名算法参考:

public static String Signature(String appsecret, String strToSign){
            // 创建 HMAC-SHA256 算法实例
            Mac sha256_HMAC = Mac.getInstance("HmacSHA256");
            SecretKeySpec secret_key = new SecretKeySpec(appsecret.getBytes(), "HmacSHA256");
            // 初始化 HMAC 实例
            sha256_HMAC.init(secret_key);
            // 计算 HMAC 的值
            byte[] hash = sha256_HMAC.doFinal(strToSign.getBytes());
            // 将结果编码为 Base64 字符串
            return Base64.getEncoder().encodeToString(hash);
        }

go签名算法参考:

func Signature(appsecret, strToSign string) (result string) {
    sha256 := sha256.New
    hash := hmac.New(sha256, []byte(appsecret))
    hash.Write([]byte(strToSign))
    return base64.StdEncoding.EncodeToString(hash.Sum(nil))
}

python签名算法参考

def sign_hmac_sha256(key, message):
    # 将key和message转换为字节类型
    key = key.encode('utf-8')
    message = message.encode('utf-8')

    # 将key和message转换为字节类型
    h = hmac.new(key, message, hashlib.sha256)

    # 获取哈希的十六进制表示形式,并进行base64编码
    return base64.b64encode(h.digest()).decode('utf-8')

php签名算法参考:

function signature($appsecret, $strToSign) {
    $hash = hash_hmac('sha256', $strToSign, $appsecret, true);
    return base64_encode($hash);
}

验证参数:
appsecret = ‘4bwrpl2m7mgysn1ayhqw’
msg = ‘appkey=appk&nonce=robot&timestamp=1721971207’
使用上面参数进行测试,得出加密后的参数如下,则算法正确
加密后的signature:OQccDUOGi/51rB3AqJDCFmkQW34Xr4YSB9LpKCMWws8=

文档更新时间: 2024-10-25 10:34   作者:admin