golang 版 E签宝请求签名鉴权方式

E签宝 请求签名鉴权方式说明

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)
}
相关推荐
SunnyDays1011几秒前
如何使用 JAVA 将 PDF 转换为 PPT:完整指南
java·开发语言·pdf转ppt
csbysj20202 分钟前
Python Math: 深入探索Python中的数学模块
开发语言
Bigbig.2 分钟前
驱动工程师面试题 - 操作系统1
linux·开发语言·面试·硬件架构
是一个Bug3 分钟前
Java后端开发面试题清单(50道)
java·开发语言·jvm
GIS 数据栈4 分钟前
【Seggis遥感系统升级】用C++高性能服务Drogon重构软件服务架构|QPS提升300%,性能再升级!
java·开发语言·c++·重构·架构
moxiaoran57535 分钟前
Go语言的接口
开发语言·后端·golang
浮尘笔记18 分钟前
Go语言中的同步等待组和单例模式:sync.WaitGroup和sync.Once
开发语言·后端·单例模式·golang
lsx20240620 分钟前
C++ 变量作用域
开发语言
小鸡脚来咯25 分钟前
设计模式面试介绍指南
java·开发语言·单例模式
小北方城市网25 分钟前
GEO 全场景智能生态:自适应架构重构与极限算力协同落地
开发语言·人工智能·python·重构·架构·量子计算