You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Angular项目搭配.NET Core实现自定义验证码的方案安全问题咨询

问题1:将加密后的验证码字符串发送给客户端是否正确、安全?

这个做法本身是可行且合规的,只要满足加密逻辑的安全性要求就不会有风险:

  • 首先要区分「加密」和「编码」,返回的内容不能是验证码明文的Base64编码,必须采用强加密逻辑:要么用AES等对称加密算法加密(密钥仅保存在后端),要么直接对验证码明文加盐做哈希运算,后端校验时不需要解密,直接对用户输入做相同运算后对比即可
  • 加密时必须把过期时间、*请求来源特征(比如IP)*和验证码明文绑定后再加密,避免加密后的内容被攻击者篡用
  • 只要加密逻辑符合要求,攻击者拿到密文也无法反推出原始验证码内容,不存在安全问题
问题2:当前实现方案的安全性是否足够?

该方案仅能满足初级防暴力破解的需求,针对有针对性的攻击还存在明显短板:

  • 没有绑定请求身份,攻击者可批量爬取大量验证码密文和图片,用OCR工具批量识别后建立有效验证码池,后续发起批量攻击时直接复用池内的密文+识别结果即可绕过校验
  • 未限制验证码有效期和单次有效性,攻击者爬取的验证码可长期、多次使用
  • 无接口频率限制时,攻击者可短时间内请求大量验证码,大幅提升撞库成功率
  • 若验证码图片复杂度低,当前开源OCR工具的识别准确率可达到90%以上,基本失去防护效果
问题3:是否存在更优的自定义验证码实现思路?

你可以基于现有方案做以下优化,防护能力会大幅提升,适配大多数业务场景:

  • 优先选择「后端缓存存验证码」的方案:生成验证码时生成唯一的captchaId,将验证码明文、过期时间(推荐5分钟有效期)存入Redis或内存缓存,key为captchaId,仅返回base64格式图片和captchaId给前端,不返回任何和验证码明文相关的加密内容;校验时前端传入captchaId和用户输入,后端校验完成后无论结果是否正确都立即删除该captchaId,保证每个验证码仅能使用一次
  • 小项目不想依赖缓存的话,可以把验证码明文、过期时间、请求IP绑定后用AES加密生成token返回给前端,校验时先解密,依次校验IP是否匹配、是否过期,再对比验证码内容即可
  • 提升验证码图片复杂度:增加随机干扰线、字符旋转、背景噪点,字符采用不同字体和颜色,降低OCR识别率;.NET Core跨平台部署推荐用SkiaSharp库生成验证码,避免System.Drawing.Common的跨平台兼容问题
  • 给GET验证码接口、POST校验接口增加IP级别的频率限制,比如单个IP1分钟内最多请求10次验证码,避免批量爬取

内容的提问来源于stack exchange,提问作者pandanet

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 14:54:04