sign.go 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. package main
  2. import (
  3. "crypto/hmac"
  4. "crypto/md5"
  5. "crypto/sha256"
  6. "encoding/hex"
  7. "fmt"
  8. "sort"
  9. "strings"
  10. )
  11. const (
  12. AcceptHeader = "Accept"
  13. ContentTypeHeader = "Content-Type"
  14. AuthorizationHeader = "Authorization"
  15. JsonType = "application/json"
  16. BiliVersion = "1.0"
  17. HmacSha256 = "HMAC-SHA256"
  18. BiliTimestampHeader = "x-bili-timestamp"
  19. BiliSignatureMethodHeader = "x-bili-signature-method"
  20. BiliSignatureNonceHeader = "x-bili-signature-nonce"
  21. BiliAccessKeyIdHeader = "x-bili-accesskeyid"
  22. BiliSignVersionHeader = "x-bili-signature-version"
  23. BiliContentMD5Header = "x-bili-content-md5"
  24. )
  25. //CreateSignature 生成Authorization加密串
  26. func CreateSignature(header *CommonHeader, accessKeySecret string) string {
  27. sStr := header.toSortedString()
  28. return HmacSHA256(accessKeySecret, sStr)
  29. }
  30. func Md5(str string) (md5str string) {
  31. data := []byte(str)
  32. has := md5.Sum(data)
  33. md5str = fmt.Sprintf("%x", has)
  34. return md5str
  35. }
  36. func HmacSHA256(key string, data string) string {
  37. mac := hmac.New(sha256.New, []byte(key))
  38. mac.Write([]byte(data))
  39. return hex.EncodeToString(mac.Sum(nil))
  40. }
  41. type CommonHeader struct {
  42. ContentType string
  43. ContentAcceptType string
  44. Timestamp string
  45. SignatureMethod string
  46. SignatureVersion string
  47. Authorization string
  48. Nonce string
  49. AccessKeyId string
  50. ContentMD5 string
  51. }
  52. // ToMap 所有字段转map<string, string>
  53. func (h *CommonHeader) ToMap() map[string]string {
  54. return map[string]string{
  55. BiliTimestampHeader: h.Timestamp,
  56. BiliSignatureMethodHeader: h.SignatureMethod,
  57. BiliSignatureNonceHeader: h.Nonce,
  58. BiliAccessKeyIdHeader: h.AccessKeyId,
  59. BiliSignVersionHeader: h.SignatureVersion,
  60. BiliContentMD5Header: h.ContentMD5,
  61. AuthorizationHeader: h.Authorization,
  62. ContentTypeHeader: h.ContentType,
  63. AcceptHeader: h.ContentAcceptType,
  64. }
  65. }
  66. // ToSortMap 参与加密的字段转map<string, string>
  67. func (h *CommonHeader) toSortMap() map[string]string {
  68. return map[string]string{
  69. BiliTimestampHeader: h.Timestamp,
  70. BiliSignatureMethodHeader: h.SignatureMethod,
  71. BiliSignatureNonceHeader: h.Nonce,
  72. BiliAccessKeyIdHeader: h.AccessKeyId,
  73. BiliSignVersionHeader: h.SignatureVersion,
  74. BiliContentMD5Header: h.ContentMD5,
  75. }
  76. }
  77. //ToSortedString 生成需要加密的文本
  78. func (h *CommonHeader) toSortedString() (sign string) {
  79. hMap := h.toSortMap()
  80. var hSil []string
  81. for k := range hMap {
  82. hSil = append(hSil, k)
  83. }
  84. sort.Strings(hSil)
  85. for _, v := range hSil {
  86. sign += v + ":" + hMap[v] + "\n"
  87. }
  88. sign = strings.TrimRight(sign, "\n")
  89. return
  90. }