| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899 |
- package main
- import (
- "crypto/hmac"
- "crypto/md5"
- "crypto/sha256"
- "encoding/hex"
- "fmt"
- "sort"
- "strings"
- )
- const (
- AcceptHeader = "Accept"
- ContentTypeHeader = "Content-Type"
- AuthorizationHeader = "Authorization"
- JsonType = "application/json"
- BiliVersion = "1.0"
- HmacSha256 = "HMAC-SHA256"
- BiliTimestampHeader = "x-bili-timestamp"
- BiliSignatureMethodHeader = "x-bili-signature-method"
- BiliSignatureNonceHeader = "x-bili-signature-nonce"
- BiliAccessKeyIdHeader = "x-bili-accesskeyid"
- BiliSignVersionHeader = "x-bili-signature-version"
- BiliContentMD5Header = "x-bili-content-md5"
- )
- //CreateSignature 生成Authorization加密串
- func CreateSignature(header *CommonHeader, accessKeySecret string) string {
- sStr := header.toSortedString()
- return HmacSHA256(accessKeySecret, sStr)
- }
- func Md5(str string) (md5str string) {
- data := []byte(str)
- has := md5.Sum(data)
- md5str = fmt.Sprintf("%x", has)
- return md5str
- }
- func HmacSHA256(key string, data string) string {
- mac := hmac.New(sha256.New, []byte(key))
- mac.Write([]byte(data))
- return hex.EncodeToString(mac.Sum(nil))
- }
- type CommonHeader struct {
- ContentType string
- ContentAcceptType string
- Timestamp string
- SignatureMethod string
- SignatureVersion string
- Authorization string
- Nonce string
- AccessKeyId string
- ContentMD5 string
- }
- // ToMap 所有字段转map<string, string>
- func (h *CommonHeader) ToMap() map[string]string {
- return map[string]string{
- BiliTimestampHeader: h.Timestamp,
- BiliSignatureMethodHeader: h.SignatureMethod,
- BiliSignatureNonceHeader: h.Nonce,
- BiliAccessKeyIdHeader: h.AccessKeyId,
- BiliSignVersionHeader: h.SignatureVersion,
- BiliContentMD5Header: h.ContentMD5,
- AuthorizationHeader: h.Authorization,
- ContentTypeHeader: h.ContentType,
- AcceptHeader: h.ContentAcceptType,
- }
- }
- // ToSortMap 参与加密的字段转map<string, string>
- func (h *CommonHeader) toSortMap() map[string]string {
- return map[string]string{
- BiliTimestampHeader: h.Timestamp,
- BiliSignatureMethodHeader: h.SignatureMethod,
- BiliSignatureNonceHeader: h.Nonce,
- BiliAccessKeyIdHeader: h.AccessKeyId,
- BiliSignVersionHeader: h.SignatureVersion,
- BiliContentMD5Header: h.ContentMD5,
- }
- }
- //ToSortedString 生成需要加密的文本
- func (h *CommonHeader) toSortedString() (sign string) {
- hMap := h.toSortMap()
- var hSil []string
- for k := range hMap {
- hSil = append(hSil, k)
- }
- sort.Strings(hSil)
- for _, v := range hSil {
- sign += v + ":" + hMap[v] + "\n"
- }
- sign = strings.TrimRight(sign, "\n")
- return
- }
|