验证码安全看五项
短信与邮件验证码的安全设计可以按五项规定核查:熵(长度与生成方式是否可预测)、有效期、尝试次数限制、场景与账号绑定、以及一次性(校验成功后立即作废)。除此之外还有两类运营侧问题:重发频率无限制导致短信费用被刷,以及校验接口本身缺少限流形成对验证码的爆破路径。
基本信息
| 检查点 | 熵、有效期、尝试限制、场景绑定、一次性 |
|---|---|
| 常见实现 | 6 位数字验证码,有效期 5-10 分钟,错误次数限制 3-5 次 |
| 适用平台 | 登录、注册、改密、支付确认、绑定手机场景 |
| 参考标准 | OWASP 认证备忘单、OWASP ASVS V2 |
典型使用场景
- 注册与登录链路的安全设计评审
- 排查短信费用异常增长(刷验证码)问题
- 改密与解绑手机等高敏操作的二次校验核查
- 评估验证码接口的限流与防枚举能力
- 移动端与 Web 端一致性的对照检查
核查清单
核查清单
生成:服务端生成,位数与随机性是否可预测(避免自增或时间相关)
有效期:明确时长,到期立即失效;重发是否刷新旧验证码
尝试限制:错误次数上限与超过后的处置(作废、锁定、要求重新验证)
绑定:与手机号、业务场景、请求会话绑定,串号或跨场景使用应被拒绝
一次性:校验成功后立即作废,防止同一验证码重复使用
接口限流:发送频率限制(如 60 秒一次、单日上限)与图形验证码前置检查点与判据
| 检查点 | 期望实现 | 常见问题 |
|---|---|---|
| 长度与随机性 | 足够空间且服务端随机生成 | 4 位数字、序列化生成 |
| 有效期 | 明确且较短 | 长期有效或到期仍可用 |
| 尝试次数 | 有上限并触发作废 | 可无限次尝试 |
| 场景绑定 | 与业务场景严格对应 | 改密验证码可用于登录 |
| 一次性 | 校验成功即作废 | 有效期内可重复使用 |
| 发送限流 | 按账号与来源双重限制 | 可被用于短信轰炸 |
验证码校验失败返回的信息不要区分“验证码错误”与“验证码已过期”之外的其他细节,也不要在响应中暴露该手机号是否已注册,避免被用于账号枚举。
只使用自有测试账号触发验证码:用真实手机号连续触发会造成骚扰与短信费用损失,属于必须避免的动作。