Go
package utils
import (
"crypto/hmac"
"crypto/md5"
"crypto/sha256"
"encoding/base64"
"fmt"
"github.com/gogf/gf/v2/util/gconv"
)
type Sign struct {
secret string
}
func NewSign(secret string) *Sign {
return &Sign{secret}
}
// DoSign 计算签名
func (s Sign) DoSign(method, path, contentMD5, headers string) string {
accept := "*/*"
contentType := "application/json; charset=UTF-8"
date := ""
// 组合拼接待签名字符串
canonicalString := fmt.Sprintf("%s\n%s\n%s\n%s\n%s\n", method, accept, contentMD5, contentType, date)
if headers == "" {
canonicalString = fmt.Sprintf("%s%s%s", canonicalString, headers, path)
} else {
canonicalString = fmt.Sprintf("%s%s\n%s", canonicalString, headers, path)
}
// 拼接字符串
fmt.Println("拼接字符串:\n" + canonicalString + "\n")
// 最后计算签名
return s.doSignatureBase64(canonicalString, s.secret)
}
// doSignatureBase64 计算签名(HmacSHA256)
func (s Sign) doSignatureBase64(message, secret string) string {
mac := hmac.New(sha256.New, []byte(secret))
_, _ = mac.Write([]byte(message))
encode := mac.Sum(nil)
return base64.StdEncoding.EncodeToString(encode)
}
// DoContentMD5Base64 计算Body体的Content-MD5值
func (s Sign) DoContentMD5Base64(bodyData any) string {
// 创建一个新的MD5 hasher对象
md := md5.New()
// 将byte数组写入hasher中计算MD5值
md.Write([]byte(gconv.String(bodyData)))
// 获取MD5值的byte数组表示(16 bytes)
md5Bytes := md.Sum(nil)
// 转base64
return base64.StdEncoding.EncodeToString(md5Bytes)
}