Skip to content

captcha 负责图形验证码生成(出题、画图、答案写 Redis), 校验不在本包encrypt 提供加解密原语(AES-ECB、RSA)+ 接口加解密注解层。两者都依赖 config.Loadredis.Init 先就绪。

关键导出

  • captcha.Vo struct{CaptchaEnabled bool; UUID string; Img string}Img 为裸 base64,前端拼前缀)
  • captcha.Captcha / New(cfg) (*Captcha, error) / Init() / Generate(ctx) (*Vo, error) / Enabled() bool
  • encrypt.EncryptByAES(data, password) (string, error) / DecryptByAES / EncryptByBase64 / DecryptByBase64
  • encrypt.ParseRSAPrivateKey(base64) (*rsa.PrivateKey, error) / ParseRSAPublicKey / DecryptByRSA(data, key) / EncryptByRSA(data, key) / GenerateAESPassword()
  • encrypt.Crypto / New(cfg) (*Crypto, error) / Init()
  • encrypt.ApiEncrypt() gin.HandlerFunc / ApiEncryptWithResponse() 接口加解密注解

典型用法

go
// internal/auth/handler/auth_handler.go:80
vo, err := captcha.Generate(c.Request.Context())

// internal/system/router.go:65 / internal/auth/router.go:26
g.POST("/login", sagin.Ignore(), encrypt.ApiEncrypt(), handler.AuthApiApp.Login)
profile.PUT("/updatePwd", sagin.CheckLogin(), encrypt.ApiEncrypt(), /* ... */)

坑/约定

WARNING

  • captcha 只管出题画图写答案, 校验(取值→删→判空→比对)在 internal/auth/service 各策略的 validateCaptcha,Redis 键由 constant.CaptchaCodeKey 约定;算术题存答案而非题面;Img 不含 data:image/png;base64, 前缀(前端 login.vue 自拼,带前缀会图裂)。
  • Init 须在 config.Loadredis.Init 之后。
  • encrypt AES 用 ECB + PKCS#7(对齐原 Java 实现,非 GCM);密钥长度必须 16/24/32 字节。
  • RSA 私钥须 base64 编码的 PKCS#8(兼容 PKCS#1 回落);MinRSAKeySize=1024
  • ApiEncrypt() 须排在 repeatsubmit.RepeatSubmit 之前——指纹要用解密后的明文,密文每次随机 AES 密钥会使指纹漂移。 :::

相关页:/pkg-reference/ratelimiter-repeatsubmit/pkg-reference/config-database-redis/modules/auth

基于 MIT 协议开源