Gin框架学习(九)

本文详细介绍了Gin框架下三种常用的签名方法:HMAC(包括SHA256和MD5实现)、RSA签名验证以及ECDSA签名验证。通过示例代码展示了如何在Go语言中实现这些签名算法,为API的安全提供了基础保障。
摘要由CSDN通过智能技术生成

学习思维导图

Gin框架思维导图

精通篇

token

HMAC签名方法
package main
import (
	"crypto/hmac"
	"crypto/sha256"
	"crypto/md5"
	"encoding/hex"
)
// HmacSha256 加密
func HmacSha256(key string, encrypt string) string {
  // 使用sha256的加密方式
  hMac := hmac.New(sha256.New, []byte(encrypt))
  // 信息加密
  hMac.Write([]byte(key))
  // 将签名转成字符串
  sha := hex.EncodeToString(hMac.Sum(nil))
}
// 得到新的签名
newSign := HmacSha256(key, encrypt)
// 验证签名
if oldSign != newSign {
  return errors.New("无效签名")
}
// HmacMd5 加密
func HmacMd5(key string, encrypt string) string {
  // 使用Md5的加密方式
   hMac := hmac.New(md5.New, []byte(encrypt))
   // 信息加密
   hMac.Write([]byte(encrypt))
   return hex.EncodeToString(h.Sum([]byte("")))
}
RSA签名方法

package main
 
import (
	"crypto"
	"crypto/ecdsa"
	"crypto/rand"
	"crypto/rsa"
	"crypto/x509"
	"encoding/pem"
	"fmt"
	"math/big"
	"os"
)
 func rsaVerifySign(Text []byte, KeyFile string, Sign []byte) bool {
	// 读取公钥文件并解析成rsa.PublicKey
	file, err := os.Open(KeyFile)
	if err != nil {
		return false
	}
	stat, err := file.Stat()
	if err != nil {
		return false
	}
	buf := make([]byte, stat.Size())
	file.Read(buf)
	defer file.Close()
 
	block, _ := pem.Decode(buf)
	KeyInt, err := x509.ParsePKIXPublicKey(block.Bytes)
	Key := KeyInt.(*rsa.Key)
 
	// 计算原始内容的散列值
	h := sha512.New()
	h.Write(Text)
	hValue := h.Sum(nil)
 
	// 确认签名
	err = rsa.VerifyPKCS1v15(Key, crypto.SHA512,hValue, Sign)
 
	return err == nil
}
 
ECDSA签名方法
package main
import (
    "crypto/ecdsa"
    "crypto/rand"
    "fmt"
    "crypto/elliptic"
    "log"
)

func main() {
    // 生成公钥和私钥
    privateKey, err := ecdsa.GenerateKey(elliptic.P256(), rand.Reader)
    if err != nil {
        log.Fatalln(err)
    }
    publicKey := &privateKey.PublicKey
    message := []byte("签名")

    // 进入签名操作
    r, s, _ := ecdsa.Sign(rand.Reader, privateKey, message)
    // 进入验证
    flag := ecdsa.Verify(publicKey, message, r, s)
    if flag {
        fmt.Println("未被修改")
    } else {
        fmt.Println("已被修改")
    }
    flag = ecdsa.Verify(publicKey, []byte("ok"), r, s)
    if flag {
        fmt.Println("未被修改")
    } else {
        fmt.Println("已被修改")
    }
}

后记

喜欢的话可以三连,后续继续更新其他内容,帮忙推一推,感谢观看!

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

北岛末巷

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值