ZBLOG

golang HS,RS,ES,ED签名与验证

Golang 提供了多种签名和验证方法,包括 HS(HMAC-SHA)、RS(RSA)、ES(ECDSA)以及 ED(Ed25519)。下面分别介绍这些方法的使用。

  1. HS(HMAC-SHA)

HS 签名使用 HMAC-SHA 算法,需要指定一个密钥。示例代码如下:

import (
    "crypto/hmac"
    "crypto/sha256"
    "encoding/base64"
)

func signHS256(data []byte, secret []byte) (string, error) {
    h := hmac.New(sha256.New, secret)
    if _, err := h.Write(data); err != nil {
        return "", err
    }
    return base64.StdEncoding.EncodeToString(h.Sum(nil)), nil
}

func verifyHS256(data []byte, signature string, secret []byte) bool {
    expectedSignature, _ := signHS256(data, secret)
    return signature == expectedSignature
}

其中 signHS256 函数接受待签名的数据和密钥,返回签名结果;verifyHS256 函数接受待验证的数据、签名和密钥,返回是否验证通过。

  1. RS(RSA)

RS 签名使用 RSA 算法,需要生成公私钥对。示例代码如下:

import (
    "crypto/rand"
    "crypto/rsa"
    "crypto/sha256"
)

func generateRSAKeyPair() (*rsa.PrivateKey, error) {
    return rsa.GenerateKey(rand.Reader, 2048)
}

func signRSA(data []byte, privateKey *rsa.PrivateKey) ([]byte, error) {
    hash := sha256.Sum256(data)
    return rsa.SignPKCS1v15(rand.Reader, privateKey, crypto.SHA256, hash[:])
}

func verifyRSA(data []byte, signature []byte, publicKey *rsa.PublicKey) bool {
    hash := sha256.Sum256(data)
    if err := rsa.VerifyPKCS1v15(publicKey, crypto.SHA256, hash[:], signature); err != nil {
        return false
    }
    return true
}

其中 generateRSAKeyPair 函数用于生成公私钥对;signRSA 函数接受待签名的数据和私钥,返回签名结果;verifyRSA 函数接受待验证的数据、签名和公钥,返回是否验证通过。

  1. ES(ECDSA)

ES 签名使用 ECDSA 算法,需要生成公私钥对。示例代码如下:

import (
    "crypto/ecdsa"
    "crypto/rand"
    "crypto/sha256"
)

func generateECDSAKeyPair() (*ecdsa.PrivateKey, error) {
    return ecdsa.GenerateKey(elliptic.P521(), rand.Reader)
}

func signECDSA(data []byte, privateKey *ecdsa.PrivateKey) ([]byte, error) {
    hash := sha256.Sum256(data)
    r, s, err := ecdsa.Sign(rand.Reader, privateKey, hash[:])
    if err != nil {
        return nil, err
    }
    signature := append(r.Bytes(), s.Bytes()...)
    return signature, nil
}

func verifyECDSA(data []byte, signature []byte, publicKey *ecdsa.PublicKey) bool {
    if len(signature) != 2*publicKey.Params().BitSize/8 {
        return false
    }
    
	r := big.Int{}
	s := big.Int{}
	r.SetBytes(signature[:len(signature)/2])
	s.SetBytes(signature[len(signature)/2:])

	hash := sha256.Sum256(data)
	return ecdsa.Verify(publicKey, hash[:], &r, &s)
}

其中 generateECDSAKeyPair 函数用于生成公私钥对;signECDSA 函数接受待签名的数据和私钥,返回签名结果;verifyECDSA 函数接受待验证的数据、签名和公钥,返回是否验证通过。

  1. ED(Ed25519)

ED 签名使用 Ed25519 算法,需要生成公私钥对。示例代码如下:

import (
    "crypto/ed25519"
)

func generateEd25519KeyPair() (publicKey ed25519.PublicKey, privateKey ed25519.PrivateKey, err error) {
    publicKey, privateKey, err = ed25519.GenerateKey(nil)
    return
}

func signEd25519(data []byte, privateKey ed25519.PrivateKey) ([]byte, error) {
    return ed25519.Sign(privateKey, data), nil
}

func verifyEd25519(data []byte, signature []byte, publicKey ed25519.PublicKey) bool {
    return ed25519.Verify(publicKey, data, signature)
}

其中 generateEd25519KeyPair 函数用于生成公私钥对;signEd25519 函数接受待签名的数据和私钥,返回签名结果;verifyEd25519 函数接受待验证的数据、签名和公钥,返回是否验证通过。

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://golang.0voice.com/?id=6553

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?