Golang 提供了多种签名和验证方法,包括 HS(HMAC-SHA)、RS(RSA)、ES(ECDSA)以及 ED(Ed25519)。下面分别介绍这些方法的使用。
- 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 函数接受待验证的数据、签名和密钥,返回是否验证通过。
- 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 函数接受待验证的数据、签名和公钥,返回是否验证通过。
- 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 函数接受待验证的数据、签名和公钥,返回是否验证通过。
- 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 函数接受待验证的数据、签名和公钥,返回是否验证通过。




