67 lines
1.5 KiB
Go
67 lines
1.5 KiB
Go
package sign
|
||
|
||
import (
|
||
"crypto/sha256"
|
||
"encoding/base64"
|
||
"encoding/hex"
|
||
"fmt"
|
||
"github.com/spf13/cast"
|
||
"sort"
|
||
)
|
||
|
||
var filterKeys = []string{"sign", "extendParams", "msg"}
|
||
|
||
func GetSign(data map[string]interface{}, primary string) (string, error) {
|
||
filterData(&data)
|
||
sysSign, err := hash256AndBase64(sortValue(data, primary))
|
||
if err != nil {
|
||
return "", fmt.Errorf("参数加密失败")
|
||
}
|
||
return sysSign, nil
|
||
}
|
||
|
||
func filterData(data *map[string]interface{}) {
|
||
for _, key := range filterKeys {
|
||
delete(*data, key)
|
||
}
|
||
}
|
||
|
||
func sortValue(data map[string]interface{}, primary string) string {
|
||
var sortValueString string
|
||
|
||
data["key"] = primary
|
||
|
||
keys := make([]string, 0, len(data))
|
||
|
||
for k := range data {
|
||
keys = append(keys, k)
|
||
}
|
||
|
||
// 对键进行排序
|
||
sort.Strings(keys)
|
||
|
||
// 按照排序后的键的顺序输出map的值
|
||
for _, v := range keys {
|
||
sortValueString += cast.ToString(data[v])
|
||
}
|
||
return sortValueString
|
||
}
|
||
|
||
func hash256AndBase64(valueString string) (string, error) {
|
||
// 创建一个新的hash.Hash计算器,并指定算法为sha256
|
||
hasher := sha256.New()
|
||
|
||
// 写入数据到hash计算器
|
||
hasher.Write([]byte(valueString))
|
||
|
||
// Sum方法返回计算出的哈希值的字节切片
|
||
hashBytes := hasher.Sum(nil)
|
||
|
||
//将字符串编码为16进制格式,返回字符串
|
||
hashCode := hex.EncodeToString(hashBytes)
|
||
// 将哈希值的字节切片编码为Base64字符串
|
||
hashBase64 := base64.StdEncoding.EncodeToString([]byte(hashCode))
|
||
|
||
return hashBase64, nil
|
||
}
|