GenSignatureUtil.go 1.37 KB
Newer Older
Ford committed
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61
package service

import (
	"crypto/hmac"
	"crypto/sha256"
	"encoding/hex"
	"encoding/json"
	"fmt"
	"sort"
)

const (
	reqAccessPopToken     = "access-pop-token"
	reqAccessPopTimestamp = "access-pop-timestrap"
	reqAccessPopNonceStr  = "access-pop-noncestr"
)

func GenerateSignature(token, timestamp, nonceStr, appSecret string) (string, error) {
	// 使用 Go的map 和一个额外的 keys 列表保持顺序
	treeMap := make(map[string]string)
	keys := []string{
		reqAccessPopToken,
		reqAccessPopTimestamp,
		reqAccessPopNonceStr,
	}
	treeMap[reqAccessPopToken] = token
	treeMap[reqAccessPopTimestamp] = timestamp
	treeMap[reqAccessPopNonceStr] = nonceStr

	sysSignature, err := GenHMAC(treeMap, keys, appSecret)
	if err != nil {
		return "", fmt.Errorf("failed to generate HMAC: %v", err)
	}

	return sysSignature, nil
}

//生成签名
func GenHMAC(data map[string]string, keys []string, key string) (string, error) {
	// 对 keys 进行排序以确保顺序
	sort.Strings(keys)

	// 构建 JSON 字符串
	dataMapOrdered := make(map[string]string)
	for _, k := range keys {
		dataMapOrdered[k] = data[k]
	}
	jsonData, err := json.Marshal(dataMapOrdered)
	if err != nil {
		return "", err
	}

	// 创建 hmac
	h := hmac.New(sha256.New, []byte(key))
	if _, err := h.Write([]byte(jsonData)); err != nil {
		return "", err
	}
	signature := hex.EncodeToString(h.Sum(nil))
	return signature, nil

}