main.go 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. package main
  2. import (
  3. "crypto/hmac"
  4. "crypto/sha256"
  5. "encoding/base64"
  6. "fmt"
  7. "reflect"
  8. "sort"
  9. )
  10. /*1、先将需要参与签名的键值对,根据键名称 ASCII 码排序
  11. 2、获取 value 值,拼接成一行
  12. 3、使用密钥,用 HmacSHA256 对拼接的字符串进行加密
  13. 4、加密后 的密文进行 base64 编码,生成加密的字符串
  14. */
  15. type SignTool struct {
  16. SecretKey string
  17. }
  18. func NewSignTool(secret string) *SignTool {
  19. return &SignTool{
  20. SecretKey: secret,
  21. }
  22. }
  23. func (s *SignTool) Sign(obj interface{}) string {
  24. signmap := map[string]interface{}{}
  25. valueOfObj := reflect.ValueOf(obj)
  26. for i := 0; i < valueOfObj.NumField(); i++ {
  27. signmap[valueOfObj.Type().Field(i).Name] = valueOfObj.Field(i)
  28. }
  29. //进行键排序
  30. keys := make([]string, len(signmap))
  31. j := 0
  32. for k := range signmap {
  33. keys[j] = k
  34. j++
  35. }
  36. sort.Strings(keys)
  37. //获取 value 值,拼接成一行
  38. valueStr := ""
  39. for _, k := range keys {
  40. if v, ok := signmap[k]; ok {
  41. valueStr = fmt.Sprintf("%s%v", valueStr, v)
  42. }
  43. }
  44. //把 secretAccessKey 做为 key,用 HmacSHA256 对拼接的字符串
  45. //加密后 的密文进行 base64 编码,生成加密的字符串
  46. return hmacSha256(valueStr, s.SecretKey)
  47. }
  48. func hmacSha256(msg, pwd string) string {
  49. h := hmac.New(sha256.New, []byte(pwd))
  50. h.Write([]byte(msg))
  51. return base64.StdEncoding.EncodeToString(h.Sum(nil))
  52. }
  53. type Book struct {
  54. Name string `json:"name"`
  55. Price float32 `json:"price"`
  56. Number int `json:"number"`
  57. }
  58. func main() {
  59. signTool := NewSignTool("abc")
  60. book := Book{
  61. Name: "我和我的祖国",
  62. Price: 100.00,
  63. Number: 20,
  64. }
  65. sign := signTool.Sign(book)
  66. fmt.Println("签名结果: ", sign)
  67. }