短信验证码安全文章封面,列出接口被刷、暴力猜测、撞库和诈骗套码

短信验证码能不能被破解?如果系统设计合理,这串数字是随机生成、有效期短、只能用一次的,靠猜很难猜中。现实中出事的,多数不是数字被“算”出来,而是业务系统哪里没设防:错误次数不限、验证码不过期、接口能被随意调用,或者用户自己被骗着把短信内容念给了对方。

我们给客户对接短信接口时,最常被问的是“通道安不安全”。其实通道只负责把短信送到手机上,验证码安全的大部分功夫在你自己的业务逻辑里。下面按风险类型说,只讲防护,不讲攻击细节。

风险一:验证码接口被恶意调用

这是最常见、损失也最直接的一种。有人用程序反复请求发送接口,要么是为了消耗你的短信费用,要么是拿你的接口去给别人的手机狂发短信,也就是常说的短信轰炸。被轰炸的用户会投诉,你的签名也跟着背锅。

防护要放在“发送之前”:

防止验证码接口被刷的三道关:人机校验、多维限频和来源校验

图 1:发送接口的三道防护:人机校验、限频和来源校验。

  • 请求发送前先做人机校验,比如图形验证码、滑块;
  • 按手机号、IP、设备分别设频率限制,比如同一号码 60 秒内只能请求 1 次,每天有总上限;
  • 发送接口别裸露,校验请求来源和会话,没打开过页面的请求直接拒绝。

风险二:暴力猜测验证码

位数少、错误次数不限、有效期又长,这三个条件凑齐了,理论上就有被逐个尝试的可能。防住它不难。

限制错误次数是最关键的一道。同一个码连续输错几次就作废,要求重新获取;有效期控制在几分钟以内;验证成功一次立即失效,不能重复使用。位数一般 4 到 6 位,安全要求高的业务用 6 位更稳妥。另外,校验必须在服务端完成,前端只负责展示。

风险三:撞库后用验证码兜底

撞库是指别人拿着从其他网站泄露的账号密码来你这儿尝试登录。有的系统为了安全,在异地登录时加一道短信验证码,这本身是对的;问题在于,有些系统的发码和登录校验没有和同一个会话绑定,验证码发到 A 手机,B 的会话也能用。

这里的要点是绑定关系:验证码要和手机号、业务场景、当前会话一起校验。注册用的验证码不能拿去改密码,这个会话申请的码不能在另一个会话里用。

风险四:诈骗分子套取验证码

技术上再严密,用户把验证码告诉别人也挡不住。冒充客服、冒充快递理赔、冒充熟人借钱,最后一步往往都是“把收到的验证码报给我”。

企业能做的是两件事。第一,在短信里明确写出用途,并提醒“请勿告诉他人”,例如:

【示例品牌】您正在修改登录密码,验证码{验证码},5分钟内有效。工作人员不会向您索要,请勿告知他人。

第二,对敏感操作(改绑手机、修改支付密码、大额操作)不要只靠一条短信,叠加原密码、人脸或其他校验。用途写清楚,用户看到“修改密码”而自己没在操作,就能反应过来不对。

平时还要做好监控

规则设好了,也要有人看数据。很多团队上线时把限制做得很严,过半年业务调整、接口改版,限制被顺手放宽了却没人记得,等到账单异常才翻出来。验证码短信的发送量、验证成功的比例、单个 IP 或号码段的请求分布,这几项最好做成看板。半夜发送量突然上涨,或者大量请求集中在某几个号码段,基本可以判断接口正在被刷。

再加一个账户余额和发送量的告警,出了问题能第一时间知道,而不是第二天看账单才发现。

小程序和 App 也不例外

很多人觉得小程序有平台登录兜底,这方面不用太操心。实际上只要你的后端提供了发送验证码的接口,就存在被直接调用的可能,防护规则一样要在服务端做。如果你在开发小程序时需要接入短信验证码,可以看看我们的小程序开发和短信接口服务说明。

结论

短信验证码本身很难被破解,风险主要来自四个地方:接口被刷、错误次数不限导致暴力猜测、验证码没有和会话绑定、用户被诈骗套取。对应的防护是发送前人机校验和频率限制,校验时限制错误次数、设短有效期、一次一用、绑定手机号和会话,短信内容写清用途并提醒勿告知他人,敏感操作叠加其他校验。蔚岚科技可以协助企业梳理验证码接入和防护方案,有需要打 18720919319,或联系我们。

常见问题

4 位验证码安全吗?

在限制错误次数和有效期的前提下,普通登录场景一般够用。涉及资金或账号修改的场景,建议用 6 位并叠加其他校验。

验证码有效期设多久合适?

一般几分钟就够了,太长会增加被利用的时间窗口,太短又影响信号差的用户。可以按业务场景调整。

用户说验证码被别人用了怎么办?

先冻结相关操作,翻一下登录和校验日志,确认是用户泄露还是系统问题。同时提醒用户修改密码并检查绑定信息。

短信通道会泄露验证码吗?

正规通道一般不会,风险更多在业务系统和用户端。选择有资质的平台,接口用加密传输,日志里别明文记录码值。

只用图形验证码能防住接口被刷吗?

能挡掉一部分,但不够。图形校验要和频率限制、会话校验、监控告警一起用,单靠一种手段容易被绕过。