本文相关词汇:
OTP - One-Time Password 一次性动态密码,这种验证码具有时效性,通常有效期在1~2分钟内。手机短信验证码就是一种OTP。
MFA - 多重因子认证。先说单因子认证,我们的系统登录通常是 账密登录,这种就是 单因子认证方式的登录。现在为了安全,许多网站开始使用双因子认证登录。
双因子认证-TFA 或 2FA,如 账密+手机号,如账密+滑块,等。
TOTP - TOTP, 基于时间算法的一次性动态码,是一次性动态码的一种实现方式。
captcha-通俗的含义是验证码。captcha是“Completely Automated Public Turing test to tell Computers and Humans Apart”(全自动区分计算机和人类的图灵测试)的缩写。也是系统安全层面的东西。
JWTToken -JWT令牌/JwtToken, json web token。
现在移动应用通常都支持手机短信验证码登录(下文称“短验登录”),对于终端用户来说,这是比较便捷的登录方式。
短验登录的交互很简单。前端页面 输入手机号,点击获取验证码,然后输入收到的短信验证码,点击登录,完成应用的登录。
那么,对于后端,不外乎提供2个API。一个是获取验证码接口,一个是短验登录接口。
再具体一些,后端这2个接口,我们来设计一下。
1. 获取验证码接口。 入参是 手机号,返参 主要是一组 code/msg。
程序逻辑是 先验证手机号在系统里是否存在,不存在直接返回code为错误码。手机号存在后,利用一定算法生成一个6位数的一次性动态码,以手机号作为key设置redis缓存,然后向手机号发送短信,返回 code=200 的正常响应。
2. 短验登录接口。入参是 手机号、短信验证码,返参 除了 code/msg 外,还包括 用户的关键属性。
程序逻辑是 以手机号为key读取redis缓存,验证 入参验证码 是否与缓存一致,不一致直接返回code为错误码。验证码正确后,获取用户信息,保存登录session,或生成token,返回 code=200、sessionId以及用户的关键属性。
OK,接下来,我要说的是,从软件系统安全层面来考虑,如何保证 短验接口 的安全。就是说,如果我们单单按照上面设计的 短验登录 来实现我们的代码逻辑,那么,当恶意攻击者 伪造入参数据,不断攻击我们这个接口,我们岂不是一直持续不断地访问redis?
这显然不太好。
那么,从程序设计的角度,如何优化 短验登录接口 呢?
大家很快能想到一种方式, 获取验证码接口 多返回一个 key,后面请求 短验登录接口 时,携带这个 key, 服务端程序先校验key,key校验通过后,才走后续 短验登录 逻辑。
这里存在一个问题:短验接口 如何识别这个 key 的合法性呢?
让服务端保存 key 吗?保存 key 岂不是依然绕不开 redis 等中间件吗?(注意:我的前提是:服务端程序是集群部署,非单点)
那么,该怎么优化呢?
只要思想不滑坡,办法总比困难多。
(未完待续)
后附:
标签:手机号,登录,短验,验证码,接口,恶意,key From: https://www.cnblogs.com/buguge/p/18164572