rsa.go 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. package utils
  2. import (
  3. "crypto/rand"
  4. "crypto/rsa"
  5. "crypto/x509"
  6. "encoding/base64"
  7. "errors"
  8. "fmt"
  9. "golang.org/x/crypto/bcrypt"
  10. )
  11. const (
  12. privateKeyText = "MIIBUwIBADANBgkqhkiG9w0BAQEFAASCAT0wggE5AgEAAkEA0vfvyTdGJkdbHkB8mp0f3FE0GYP3AYPaJF7jUd1M0XxFSE2ceK3k2kw20YvQ09NJKk+OMjWQl9WitG9pB6tSCQIDAQABAkA2SimBrWC2/wvauBuYqjCFwLvYiRYqZKThUS3MZlebXJiLB+Ue/gUifAAKIg1avttUZsHBHrop4qfJCwAI0+YRAiEA+W3NK/RaXtnRqmoUUkb59zsZUBLpvZgQPfj1MhyHDz0CIQDYhsAhPJ3mgS64NbUZmGWuuNKp5coY2GIj/zYDMJp6vQIgUueLFXv/eZ1ekgz2Oi67MNCk5jeTF2BurZqNLR3MSmUCIFT3Q6uHMtsB9Eha4u7hS31tj1UWE+D+ADzp59MGnoftAiBeHT7gDMuqeJHPL4b+kC+gzV4FGTfhR9q3tTbklZkD2A=="
  13. )
  14. // privateKeyText: Base64编码的PKCS#8格式RSA私钥字符串
  15. // text: Base64编码的密文字符串
  16. func DecryptByPrivateKey(text string) (string, error) {
  17. // 1. Base64解码私钥文本
  18. privateKeyBytes, err := base64.StdEncoding.DecodeString(privateKeyText)
  19. if err != nil {
  20. return "", fmt.Errorf("私钥Base64解码失败: %w", err)
  21. }
  22. // 2. 解析PKCS#8格式的私钥(对应Java的PKCS8EncodedKeySpec)
  23. key, err := x509.ParsePKCS8PrivateKey(privateKeyBytes)
  24. if err != nil {
  25. return "", fmt.Errorf("解析PKCS#8私钥失败: %w", err)
  26. }
  27. // 3. 断言为RSA私钥
  28. privateKey, ok := key.(*rsa.PrivateKey)
  29. if !ok {
  30. return "", errors.New("私钥类型不是RSA")
  31. }
  32. // 4. Base64解密密文
  33. cipherText, err := base64.StdEncoding.DecodeString(text)
  34. if err != nil {
  35. return "", fmt.Errorf("密文Base64解码失败: %w", err)
  36. }
  37. // 5. RSA解密(Java默认是RSA/ECB/PKCS1Padding,对应Go的PKCS1v15填充)
  38. plainText, err := rsa.DecryptPKCS1v15(rand.Reader, privateKey, cipherText)
  39. if err != nil {
  40. return "", fmt.Errorf("RSA解密失败: %w", err)
  41. }
  42. // 6. 转换为字符串返回
  43. return string(plainText), nil
  44. }
  45. // EncodePassword 等价于Java的passwordEncoder.encode(),返回哈希后的密码字符串
  46. func EncodePassword(rawPassword string) (string, error) {
  47. // 生成盐值(cost取值4-31,值越高加密越慢越安全,默认10,与Java BCryptPasswordEncoder一致)
  48. salt, err := bcrypt.GenerateFromPassword([]byte(rawPassword), bcrypt.DefaultCost)
  49. if err != nil {
  50. return "", fmt.Errorf("encode password failed: %w", err)
  51. }
  52. return string(salt), nil
  53. }
  54. // VerifyPassword 等价于Java的passwordEncoder.matches(),验证密码是否匹配
  55. func VerifyPassword(rawPassword, encodedPassword string) bool {
  56. err := bcrypt.CompareHashAndPassword([]byte(encodedPassword), []byte(rawPassword))
  57. return err == nil
  58. }