ZBLOG

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

在Golang中,我们可以使用第三方库来进行HS、RS、ES和ED签名与验证。

  1. HS(HMAC-SHA)签名与验证

对于HS签名算法,我们可以使用crypto/hmac包生成HMAC,并结合hash函数生成消息认证码。下面是示例代码:

  1. package main
  2. import (
  3. "crypto/hmac"
  4. "crypto/sha256"
  5. "encoding/base64"
  6. "fmt"
  7. )
  8. func signHS(message string, key string) (string, error) {
  9. keyBytes, err := base64.StdEncoding.DecodeString(key)
  10. if err != nil {
  11. return "", err
  12. }
  13. hmac := hmac.New(sha256.New, keyBytes)
  14. hmac.Write([]byte(message))
  15. signature := hmac.Sum(nil)
  16. return base64.StdEncoding.EncodeToString(signature), nil
  17. }
  18. func verifyHS(message string, signature string, key string) bool {
  19. calculatedSignature, _ := signHS(message, key)
  20. return calculatedSignature == signature
  21. }
  22. func main() {
  23. message := "Hello World!"
  24. key := "MzQ0Njg5MjA2NDExMTIyNDMyMDAwMDAxODc3NTM4NzE="
  25. signature, err := signHS(message, key)
  26. if err != nil {
  27. panic(err)
  28. }
  29. fmt.Println("Signature:", signature)
  30. valid := verifyHS(message, signature, key)
  31. fmt.Println("Valid:", valid)
  32. }

在上面的代码中,我们使用crypto/hmac包生成了一个HMAC-SHA256签名,并将其编码为base64格式字符串返回。然后,我们可以使用verifyHS函数来验证签名是否有效。

  1. RS(RSA)签名与验证

对于RS签名算法,我们可以使用crypto/rsa包生成数字签名,并使用公钥验证签名。下面是示例代码:

  1. package main
  2. import (
  3. "crypto/rand"
  4. "crypto/rsa"
  5. "crypto/sha256"
  6. "crypto/x509"
  7. "encoding/pem"
  8. "fmt"
  9. )
  10. func signRS(message string, privateKeyStr string) (string, error) {
  11. block, _ := pem.Decode([]byte(privateKeyStr))
  12. if block == nil || block.Type != "RSA PRIVATE KEY" {
  13. return "", fmt.Errorf("invalid private key")
  14. }
  15. privateKey, err := x509.ParsePKCS1PrivateKey(block.Bytes)
  16. if err != nil {
  17. return "", err
  18. }
  19. hashed := sha256.Sum256([]byte(message))
  20. signature, err := rsa.SignPKCS1v15(rand.Reader, privateKey, crypto.SHA256, hashed[:])
  21. if err != nil {
  22. return "", err
  23. }
  24. return base64.StdEncoding.EncodeToString(signature), nil
  25. }
  26. func verifyRS(message string, signature string, publicKeyStr string) bool {
  27. publicBlock, _ := pem.Decode([]byte(publicKeyStr))
  28. if publicBlock == nil || publicBlock.Type != "PUBLIC KEY" {
  29. return false
  30. }
  31. pubInterface,err:=x509.ParsePKIXPublicKey(publicBlock.Bytes)
  32. if err!=nil{
  33. return false
  34. }
  35. publicKey,_:=pubInterface.(*rsa.PublicKey)
  36. hashed := sha256.Sum256([]byte(message))
  37. sigBytes,err:=base64.StdEncoding.DecodeString(signature)
  38. if err!=nil{
  39. return false
  40. }
  41. err = rsa.VerifyPKCS1v15(publicKey,crypto.SHA256,&hashed,sigBytes)
  42. return err==nil
  43. }
  44. func main() {
  45. message := "Hello World!"
  46. privateKeyStr := `-----BEGIN RSA PRIVATE KEY-----
  47. MIIEpAIBAAKCAQEAo5txO3i+g82v3gZ/RfLZD0b+xT3jF4aikmz8/vs5CnqIL0w
  48. JrCz1O2XUAsyLDhX9P+MjjipWVdo8f1C6lGWso80dJovGffocO6Gcgb8Dnj7inRb
  49. MmEQdygzBxLO4tI37Ld2/z7xuIHxDaWXEe9cTPYgsN6rHFDw97eoqecErHkUbbSy
  50. gcmymBCK/7kpmsdnlqwSwKCGCyN8VOoP+z3kWYYuNbOVfJ62o4EzBYWe+QCChkwf
  51. CDMYaoZpzmOWTLsEdjbCCZIDznG+cVH0WrCX+tz1ArXheSZ75vlKLTYIFjpHNIZ+
  52. HEQs33DJbcDG60vFYZzpS/lvHi6bovVQlNsLxwIDAQABAoIBAGlzAcKP5C+bFaRO
  53. PNayViL9FR/Mav8IeJjnxkfnCuOnVSC7SQOmCSAXA55/CtaRPmPUyxnKTNSkFo86
  54. rMM9fiIeqgep/Xch17OHLSbBDHYHoEWULduEq41+YtufRT69Bvk99Dt/35dc2jTD
  55. GNh5ZZTZx3jHa3vsOsSBwywuMnn2eMWb56ugojhhONlf0s7TnV+6J1pHs4yUZaTh
  56. BvXamO5zWu9S/2DfLPDeij3rkKgGw3LrjNl64+vIDtqFkj+fQ+elCBLc6lcKo8N+
  57. vvgPfT/tLbQ2d3slHxwyWSEdjJwbNy8vnbrASi4A0/GvIilhjEeEYOL72GGgzCXk
  58. tDCjGAECgYEA2zwRGlpPkM+xpbmUM7nRAGBDWfc34lTkm+OfWr5JjsrUycse/MrH
  59. KHigpjnKwSmsKBNQTjBCltb4pgAYf0fnqLYOyXxLFzPW+tOpFdIMHIkArQGmlqoE
  60. peSzW80akprulkbRVhwx7sweTDZC27/K/UioX3dL7uv55bg05MyLIbMCgYEAuDPZ
  61. bdHoYM+aJqx8KWPyZckynV93TOOSAH4sy9j+lCA7goHNJ/Nsi+hAgdeULa+kg/W/
  62. eJMrCeF2RpMArOksqu1IdBpxUKziF5BHa/NEezAjPNwrPiAzcoYnuFeasw6tRyvm
  63. Qt87l+17ILyA+n0glOdfkCdgrzyylUNIImINvtECgYBGz/5VdloWSxWE/BnAVXap
  64. adDsgGHIP54niEEIHmUPebLQjtzjC8VY+W6tIrrL/pvKqJfOu1ZzWdpsnlvcFze5
  65. akgD0e/3WJbly4kN+9aXy6BpkkNyqpZihehRUPr0ZZn7vnt8wQv52AFDcXs47wIM
  66. Tm3KMWhmrHia/s56z3IeMQKBgQCXB1/wARdfGtU2+4dtKhLcBID/fhEcx/45Ed61
  67. 1lKHzwoOXOJidY3h06aR/vaT6Mlb5tp5+PqhSbToSNu0AKxtPqgmQ6yNWsbGoEGG
  68. XbCbdCfG+Nds9VCupMM/eCICBfuHT8CiBuIx1eiuhUBjXOLML2wdjr/GHFNdhYBY
  69. Nox05QKBgQCx/uBWTPcjpiTp+/DuOGeynaA9ytRkyoHblMudkA4v6+vGAivKyoYY
  70. oeqvnpUprifnrGRwth7Id22jzjh7llBKRMPLmvAvbuKFu+fGpSse7EAs9Szww38t
  71. N+tqZoWdug/jHIv94TksDEIkPgld2cdiRN16/RnwNxREAmIsbmRxNg==
  72. -----END RSA PRIVATE KEY-----`
  73. publicKeyStr := `-----BEGIN PUBLIC KEY-----
  74. MIIBITANBgkqhkiG9w0BAQEFAAOCAQ4AMIIBCQKCAQEAo5txO3i+g82v3gZ/RfLZ
  75. D0b+xT3jF4aikmz8/vs5CnqIL0wJrCz1O2XUAsyLDhX9P+MjjipWVdo8f1C6lGWs
  76. o80dJovGffocO6Gcgb8Dnj7inRbMmEQdygzBxLO4tI37Ld2/z7xuIHxDaWXEe9cT
  77. PYgsN6rHFDw97eoqecErHkUbbSygcmymBCK/7kpmsdnlqwSwKCGCyN8VOoP+z3kW
  78. YYuNbOVfJ62o4EzBYWe+QCChkwfCDMYaoZpzmOWTLsEdjbCCZIDznG+cVH0WrCX+
  79. tz1ArXheSZ75vlKLTYIFjpHNIZ+HEQs33DJbcDG60vFYZzpS/lvHi6bovVQlNsLx
  80. wIDAQAB
  81. -----END PUBLIC KEY-----`
  82. signature, err := signRS(message, privateKeyStr)
  83. if err != nil {
  84. panic(err)
  85. }
  86. fmt.Println("Signature:", signature)
  87. valid := verifyRS(message, signature, publicKeyStr)
  88. fmt.Println("Valid:", valid)
  89. }

在上面的代码中,我们使用crypto/rsa包生成了一个数字签名,并使用公钥验证签名是否有效。

  1. ES(ECDSA)签名与验证

对于ES签名算法,我们可以使用crypto/ecdsa包生成数字签名,并使用公钥验证签名。下面是示例代码:

”` package main

import (

  1. "crypto/ecdsa"
  2. "crypto/elliptic"
  3. "crypto/rand"
  4. "encoding/base64"
  5. "encoding/pem"
  6. "fmt"

)

func signES(message string, privateKeyStr string) (string, error) {

  1. block, _ := pem.Decode([]byte(privateKeyStr))
  2. if block == nil || block.Type != "EC PRIVATE KEY" {
  3. return "", fmt.Errorf("invalid private key")
  4. }
  5. privateKey,err:=x509.ParseECPrivateKey(block.Bytes)
  6. if err!=nil{
  7. return "",err
  8. }
  9. hashed := sha256.Sum256([]byte(message))
  10. r,s,err:=ecdsa.Sign(rand.Reader,privateKey,hashed[:])
  11. if err!=nil{
  12. return "",err
  13. }
  14. signature:=append(r.Bytes(),s.Bytes()...)
  15. return base64.StdEncoding.EncodeToString(signature), nil

}

func verifyES(message string, signature string, publicKeyStr string) bool {

  1. publicBlock,_:=pem.Decode([]byte(publicKeyStr))
  2. if publicBlock==nil||publicBlock.Type!="EC PUBLIC KEY"{
  3. return false
  4. }
  5. publicInterface,err:=x509.ParsePKIXPublicKey(publicBlock.Bytes)
  6. if err!=nil{
  7. return false
  8. }
  9. publicKey,_:=publicInterface.(*ecdsa.PublicKey)
  10. sigBytes,err:=base64.StdEncoding.DecodeString(signature)
  11. if err!=nil{
  12. return false
  13. }
  14. rBytes:=sigBytes[0:32]
  15. sBytes:=sigBytes[32:]
  16. var r,s big.Int
  17. r.SetBytes(rBytes)
  18. s.SetBytes(sBytes)
  19. hashed := sha256.Sum256([]byte(message))
  20. return ecdsa.Verify(publicKey,&hashed,&r,&s)

}

func main() {

  1. message := "Hello World!"
  2. privateKeyStr := `-----BEGIN EC PRIVATE KEY-----

MHcCAQEEIJ5Mn8mW7z00bFRUqC2Sd8qwu9w0Y1xLJXyT6fIu1LmnoAoGCCqGSM49 AwEHoUQDQgAEZs+KRpHQzMT3kHYZOJ4+5AkGrPjP79xjBgzVnln0F12EeNvI76sA kP/NUo0mZiVL5wFcaS5HAt9tI6+aqk8f+w== —–END EC PRIVATE KEY—–`

  1. publicKeyStr := `-----BEGIN EC PUBLIC KEY-----

MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEZs+KRpHQzMT3kHYZOJ4+5AkGrPj7 9xjBgzVnln0F12EeNvI76sAkP/NUo0mZiVL5wFcaS5H

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

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

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

联系我们

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

微信号:3007537140

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

关注我们
x

注册

已经有帐号?