lestrrat-go/dsig
GitHub: lestrrat-go/dsig
Go 语言的底层数字签名工具库,以统一接口支持 RSA、ECDSA、EdDSA 和 HMAC 等多种签名算法的生成与验证。
Stars: 1 | Forks: 0
# github.com/lestrrat-go/dsig [](https://github.com/lestrrat-go/dsig/actions/workflows/ci.yml) [](https://pkg.go.dev/github.com/lestrrat-go/dsig) [](https://codecov.io/github/lestrrat-go/dsig?branch=v1)
提供底层数字签名操作的 Go module。
尽管生成和验证数字签名的标准有很多,但其核心操作几乎是相同的。本模块以与框架无关的方式实现了数字签名生成/验证的核心功能。
# 功能
* RSA 签名(PKCS1v15 和 PSS)
* ECDSA 签名(P-256, P-384, P-521)
* EdDSA 签名(Ed25519, Ed448)
* HMAC 签名(SHA-256, SHA-384, SHA-512)
* 支持 crypto.Signer 接口
* 通过 `Signer`/`Verifier` 接口进行自定义算法注册
# 概要
```
package examples_test
import (
"crypto/ecdsa"
"crypto/ed25519"
"crypto/elliptic"
"crypto/rand"
"crypto/rsa"
"fmt"
"github.com/lestrrat-go/dsig"
)
func Example() {
payload := []byte("hello world")
// RSA signing and verification
{
privKey, err := rsa.GenerateKey(rand.Reader, 2048)
if err != nil {
fmt.Printf("failed to generate RSA key: %s\n", err)
return
}
// Sign with RSA-PSS SHA256
signature, err := dsig.Sign(privKey, dsig.RSAPSSWithSHA256, payload, nil)
if err != nil {
fmt.Printf("failed to sign with RSA: %s\n", err)
return
}
// Verify with RSA-PSS SHA256
err = dsig.Verify(&privKey.PublicKey, dsig.RSAPSSWithSHA256, payload, signature)
if err != nil {
fmt.Printf("failed to verify RSA signature: %s\n", err)
return
}
}
// ECDSA signing and verification
{
privKey, err := ecdsa.GenerateKey(elliptic.P256(), rand.Reader)
if err != nil {
fmt.Printf("failed to generate ECDSA key: %s\n", err)
return
}
// Sign with ECDSA P-256 SHA256
signature, err := dsig.Sign(privKey, dsig.ECDSAWithP256AndSHA256, payload, nil)
if err != nil {
fmt.Printf("failed to sign with ECDSA: %s\n", err)
return
}
// Verify with ECDSA P-256 SHA256
err = dsig.Verify(&privKey.PublicKey, dsig.ECDSAWithP256AndSHA256, payload, signature)
if err != nil {
fmt.Printf("failed to verify ECDSA signature: %s\n", err)
return
}
}
// EdDSA signing and verification
{
pubKey, privKey, err := ed25519.GenerateKey(rand.Reader)
if err != nil {
fmt.Printf("failed to generate Ed25519 key: %s\n", err)
return
}
// Sign with EdDSA
signature, err := dsig.Sign(privKey, dsig.EdDSA, payload, nil)
if err != nil {
fmt.Printf("failed to sign with EdDSA: %s\n", err)
return
}
// Verify with EdDSA
err = dsig.Verify(pubKey, dsig.EdDSA, payload, signature)
if err != nil {
fmt.Printf("failed to verify EdDSA signature: %s\n", err)
return
}
}
// HMAC signing and verification
{
key := []byte("secret-key")
// Sign with HMAC SHA256
signature, err := dsig.Sign(key, dsig.HMACWithSHA256, payload, nil)
if err != nil {
fmt.Printf("failed to sign with HMAC: %s\n", err)
return
}
// Verify with HMAC SHA256
err = dsig.Verify(key, dsig.HMACWithSHA256, payload, signature)
if err != nil {
fmt.Printf("failed to verify HMAC signature: %s\n", err)
return
}
}
// OUTPUT:
}
```
源码:[examples/dsig_readme_example_test.go](https://github.com/lestrrat-go/dsig/blob/v1/examples/dsig_readme_example_test.go)
# 支持的算法
| 常量 | 算法 | 密钥类型 |
|----------|-----------|----------|
| `HMACWithSHA256` | 使用 SHA-256 的 HMAC | []byte |
| `HMACWithSHA384` | 使用 SHA-384 的 HMAC | []byte |
| `HMACWithSHA512` | 使用 SHA-512 的 HMAC | []byte |
| `RSAPKCS1v15WithSHA256` | 使用 SHA-256 的 RSA PKCS#1 v1.5 | *rsa.PrivateKey / *rsa.PublicKey |
| `RSAPKCS1v15WithSHA384` | 使用 SHA-384 的 RSA PKCS#1 v1.5 | *rsa.PrivateKey / *rsa.PublicKey |
| `RSAPKCS1v15WithSHA512` | 使用 SHA-512 的 RSA PKCS#1 v1.5 | *rsa.PrivateKey / *rsa.PublicKey |
| `RSAPSSWithSHA256` | 使用 SHA-256 的 RSA PSS | *rsa.PrivateKey / *rsa.PublicKey |
| `RSAPSSWithSHA384` | 使用 SHA-384 的 RSA PSS | *rsa.PrivateKey / *rsa.PublicKey |
| `RSAPSSWithSHA512` | 使用 SHA-512 的 RSA PSS | *rsa.PrivateKey / *rsa.PublicKey |
| `ECDSAWithP256AndSHA256` | 使用 P-256 和 SHA-256 的 ECDSA | *ecdsa.PrivateKey / *ecdsa.PublicKey |
| `ECDSAWithP384AndSHA384` | 使用 P-384 和 SHA-384 的 ECDSA | *ecdsa.PrivateKey / *ecdsa.PublicKey |
| `ECDSAWithP521AndSHA512` | 使用 P-521 和 SHA-512 的 ECDSA | *ecdsa.PrivateKey / *ecdsa.PublicKey |
| `EdDSA` | 使用 Ed25519 或 Ed448 的 EdDSA | ed25519.PrivateKey / ed25519.PublicKey |
# 描述
本库提供底层数字签名操作。为了性能考虑,它只进行最少的参数验证,使用强类型 API,并且具有极少的依赖项。
# 贡献
## 问题
对于错误报告和功能请求,请尽可能提供失败的测试用例。
## Pull Requests
请提供能够验证您所做更改的测试用例。
# 相关库
* [github.com/lestrrat-go/jwx](https://github.com/lestrrat-go/jwx) - JOSE (JWA/JWE/JWK/JWS/JWT) 实现
标签:EVTX分析, 日志审计