| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869 |
- package utils
- import (
- "crypto/rand"
- "crypto/rsa"
- "crypto/x509"
- "encoding/base64"
- "errors"
- "fmt"
- "golang.org/x/crypto/bcrypt"
- )
- const (
- privateKeyText = "MIIBUwIBADANBgkqhkiG9w0BAQEFAASCAT0wggE5AgEAAkEA0vfvyTdGJkdbHkB8mp0f3FE0GYP3AYPaJF7jUd1M0XxFSE2ceK3k2kw20YvQ09NJKk+OMjWQl9WitG9pB6tSCQIDAQABAkA2SimBrWC2/wvauBuYqjCFwLvYiRYqZKThUS3MZlebXJiLB+Ue/gUifAAKIg1avttUZsHBHrop4qfJCwAI0+YRAiEA+W3NK/RaXtnRqmoUUkb59zsZUBLpvZgQPfj1MhyHDz0CIQDYhsAhPJ3mgS64NbUZmGWuuNKp5coY2GIj/zYDMJp6vQIgUueLFXv/eZ1ekgz2Oi67MNCk5jeTF2BurZqNLR3MSmUCIFT3Q6uHMtsB9Eha4u7hS31tj1UWE+D+ADzp59MGnoftAiBeHT7gDMuqeJHPL4b+kC+gzV4FGTfhR9q3tTbklZkD2A=="
- )
- // privateKeyText: Base64编码的PKCS#8格式RSA私钥字符串
- // text: Base64编码的密文字符串
- func DecryptByPrivateKey(text string) (string, error) {
- // 1. Base64解码私钥文本
- privateKeyBytes, err := base64.StdEncoding.DecodeString(privateKeyText)
- if err != nil {
- return "", fmt.Errorf("私钥Base64解码失败: %w", err)
- }
- // 2. 解析PKCS#8格式的私钥(对应Java的PKCS8EncodedKeySpec)
- key, err := x509.ParsePKCS8PrivateKey(privateKeyBytes)
- if err != nil {
- return "", fmt.Errorf("解析PKCS#8私钥失败: %w", err)
- }
- // 3. 断言为RSA私钥
- privateKey, ok := key.(*rsa.PrivateKey)
- if !ok {
- return "", errors.New("私钥类型不是RSA")
- }
- // 4. Base64解密密文
- cipherText, err := base64.StdEncoding.DecodeString(text)
- if err != nil {
- return "", fmt.Errorf("密文Base64解码失败: %w", err)
- }
- // 5. RSA解密(Java默认是RSA/ECB/PKCS1Padding,对应Go的PKCS1v15填充)
- plainText, err := rsa.DecryptPKCS1v15(rand.Reader, privateKey, cipherText)
- if err != nil {
- return "", fmt.Errorf("RSA解密失败: %w", err)
- }
- // 6. 转换为字符串返回
- return string(plainText), nil
- }
- // EncodePassword 等价于Java的passwordEncoder.encode(),返回哈希后的密码字符串
- func EncodePassword(rawPassword string) (string, error) {
- // 生成盐值(cost取值4-31,值越高加密越慢越安全,默认10,与Java BCryptPasswordEncoder一致)
- salt, err := bcrypt.GenerateFromPassword([]byte(rawPassword), bcrypt.DefaultCost)
- if err != nil {
- return "", fmt.Errorf("encode password failed: %w", err)
- }
- return string(salt), nil
- }
- // VerifyPassword 等价于Java的passwordEncoder.matches(),验证密码是否匹配
- func VerifyPassword(rawPassword, encodedPassword string) bool {
- err := bcrypt.CompareHashAndPassword([]byte(encodedPassword), []byte(rawPassword))
- return err == nil
- }
|