最近和合作厂商对接的时候,数据需要加密传输,响应数据需要再解密获取,由于我司使用的是Golang,而合作商使用的是Java,所以加密方法需要重构.
直接上代码(utils.go)
package libs
import (
"bytes"
"crypto/aes"
"crypto/cipher"
"crypto/hmac"
"crypto/md5"
"crypto/sha256"
"encoding/hex"
"errors"
"fmt"
"sort"
"strings"
)
// 签名加密
func Sign(sysParam map[string]string, busParam string, method string, key string) (string, error) {
if len(sysParam) == 0 || sysParam == nil {
return "", errors.New("sysParam Valid")
}
if method == "HmacSHA256" {
// 生成加密参数
decodeHexKey, _ := DecodeHexUpper(key)
busContent := EncodeAES256HexUpper(busParam, decodeHexKey)
return signWithSHA256(sysParam, busContent, key), nil
} else if method == "RSAWithMD5" {
return signWithRSA(sysParam, busParam, key), nil
} else {
return "", errors.New("method Valid")
}
}
// sha256方法加密
func signWithSHA256(sysParam map[string]string, busParam string, key string) string {
if len(busParam) > 0 && busParam != "" && len(strings.TrimSpace(busParam)) > 0 {
sysParam["content"] = busParam
}
var keys []string
for k := range sysParam {
keys = append(keys, k)
}
sort.Strings(keys)
buf := make([]string, 200)
buf = append(buf, key)
for _, v := range keys {
if !strings.EqualFold("sign", v) {
sysVal := v + sysParam[v]
buf = append(buf, sysVal)
}
}
buf = append(buf, key)
newString := ""
for _, v := range buf {
newString += fmt.Sprintf("%s", v)
}
newKey, _ := DecodeHexUpper(key)
retStr := encodeHmacSHA256HexUpper(n

最低0.47元/天 解锁文章
1066

被折叠的 条评论
为什么被折叠?



