ZBLOG

golang HS,RS,ES,ED签名密钥生成

在Golang中,我们可以使用第三方库来生成HS、RS、ES和ED签名密钥。

  1. HS(HMAC-SHA)签名密钥生成

对于HS签名算法,我们需要生成一个随机的秘钥key。下面是示例代码:

  1. package main
  2. import (
  3. "crypto/rand"
  4. "encoding/base64"
  5. "fmt"
  6. )
  7. func generateHSKey() (string, error) {
  8. key := make([]byte, 32)
  9. _, err := rand.Read(key)
  10. if err != nil {
  11. return "", err
  12. }
  13. // 将字节数组编码为base64字符串
  14. encodedKey := base64.StdEncoding.EncodeToString(key)
  15. return encodedKey, nil
  16. }
  17. func main() {
  18. key, err := generateHSKey()
  19. if err != nil {
  20. panic(err)
  21. }
  22. fmt.Println(key)
  23. }

在上面的代码中,我们使用crypto/rand包生成一个32字节的随机秘钥key,并将其编码为base64字符串返回。

  1. RS(RSA)签名密钥生成

对于RS签名算法,我们需要生成一对公私钥。下面是示例代码:

  1. package main
  2. import (
  3. "crypto/rand"
  4. "crypto/rsa"
  5. "crypto/x509"
  6. "encoding/pem"
  7. "fmt"
  8. )
  9. func generateRSKeys() (string, string, error) {
  10. privateKey, err := rsa.GenerateKey(rand.Reader, 2048)
  11. if err != nil {
  12. return "", "", err
  13. }
  14. privatePEMBlock := &pem.Block{
  15. Type: "RSA PRIVATE KEY",
  16. Bytes: x509.MarshalPKCS1PrivateKey(privateKey),
  17. }
  18. privatePEM := pem.EncodeToMemory(privatePEMBlock)
  19. publicKey := privateKey.PublicKey
  20. publicASN1, err := x509.MarshalPKIXPublicKey(&publicKey)
  21. if err != nil {
  22. return "", "", err
  23. }
  24. publicPEMBlock := &pem.Block{
  25. Type: "PUBLIC KEY",
  26. Bytes: publicASN1,
  27. }
  28. publicPEM := pem.EncodeToMemory(publicPEMBlock)
  29. return string(privatePEM), string(publicPEM), nil
  30. }
  31. func main() {
  32. privateKey, publicKey, err := generateRSKeys()
  33. if err != nil {
  34. panic(err)
  35. }
  36. fmt.Println("Private key:")
  37. fmt.Println(privateKey)
  38. fmt.Println("Public key:")
  39. fmt.Println(publicKey)
  40. }

在上面的代码中,我们使用crypto/rsa包生成了一对2048位的RSA公私钥,并将其转换为pem格式字符串返回。

  1. ES(ECDSA)签名密钥生成

对于ES签名算法,我们需要生成一对椭圆曲线公私钥。下面是示例代码:

  1. package main
  2. import (
  3. "crypto/ecdsa"
  4. "crypto/elliptic"
  5. "crypto/rand"
  6. "encoding/pem"
  7. "fmt"
  8. )
  9. func generateESKeys() (string, string, error) {
  10. curve := elliptic.P256()
  11. privateKey, err := ecdsa.GenerateKey(curve, rand.Reader)
  12. if err != nil {
  13. return "", "", err
  14. }
  15. privBytes, _ := x509.MarshalECPrivateKey(privateKey)
  16. privPem := &pem.Block{
  17. Type: "EC PRIVATE KEY",
  18. Bytes: privBytes,
  19. }
  20. pubBytes, _ := x509.MarshalPKIXPublicKey(&privateKey.PublicKey)
  21. pubPem := &pem.Block{
  22. Type: "EC PUBLIC KEY",
  23. Bytes: pubBytes,
  24. }
  25. return string(pem.EncodeToMemory(privPem)), string(pem.EncodeToMemory(pubPem)), nil
  26. }
  27. func main() {
  28. privateKey, publicKey, err := generateESKeys()
  29. if err != nil {
  30. panic(err)
  31. }
  32. fmt.Println("Private key:")
  33. fmt.Println(privateKey)
  34. fmt.Println("Public key:")
  35. fmt.Println(publicKey)
  36. }

在上面的代码中,我们使用crypto/ecdsa包生成了一对椭圆曲线公私钥,并将其转换为pem格式字符串返回。

  1. ED(Ed25519)签名密钥生成

对于ED签名算法,我们需要生成一个Ed25519秘钥。下面是示例代码:

  1. package main
  2. import (
  3. "crypto/rand"
  4. "crypto/ed25519"
  5. "encoding/hex"
  6. "fmt"
  7. )
  8. func generateEDKey() (string, error) {
  9. pubkey, privkey, err := ed25519.GenerateKey(rand.Reader)
  10. if err != nil {
  11. return "", err
  12. }
  13. pubkeyStr := hex.EncodeToString(pubkey)
  14. privkeyStr := hex.EncodeToString(privkey)
  15. return privkeyStr + pubkeyStr, nil
  16. }
  17. func main() {
  18. key, err := generateEDKey()
  19. if err != nil {
  20. panic(err)
  21. }
  22. fmt.Println(key)
  23. }

在上面的代码中,我们使用crypto/ed25519包生成了一个Ed25519秘钥,并将其编码为hex格式字符串返回。

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

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

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

联系我们

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

微信号:3007537140

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

关注我们
x

注册

已经有帐号?