lestrrat-go/dsig

GitHub: lestrrat-go/dsig

Go 语言的底层数字签名工具库,以统一接口支持 RSA、ECDSA、EdDSA 和 HMAC 等多种签名算法的生成与验证。

Stars: 1 | Forks: 0

# github.com/lestrrat-go/dsig [![CI](https://static.pigsec.cn/wp-content/uploads/repos/cas/ad/ad5834178f7599af9fdda11629d49cae07f2997beec49821b2920eff5bfd50e7.svg)](https://github.com/lestrrat-go/dsig/actions/workflows/ci.yml) [![Go Reference](https://pkg.go.dev/badge/github.com/lestrrat-go/dsig.svg)](https://pkg.go.dev/github.com/lestrrat-go/dsig) [![codecov.io](https://codecov.io/github/lestrrat-go/dsig/coverage.svg?branch=v1)](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分析, 日志审计