关于短信/邮箱验证码的设计

查看 41|回复 3
作者:yuyang1992test   
在做一个金融类的 app,对安全性要求较高。一个注册功能我设计了 4 个接口,才能完成注册,其中第一步:输入邮箱。第二步验证邮箱,第三步验证手机,第四步输入密码,产品还要求一段时间内验证完某个步骤后中间中断了,下次进来直接跳到下一步
还有其他比如首次登陆,更改密码。更改手机绑定,都需要这个功能,我应该如何设计呢?
如果不考虑注册的这个,因为他设计到要跳过某个步骤。我想的是两个接口
/sendCode(type:"sms", "12425724234", "scene": "login") return token
token = md5("sms"+ "12425724234" + scene), 存到 redis, 10min 过期
/verifyCode(token)
如果验证成功,生成一个 authToken, 存到 redis,返回一个 authToken, 后续比如更改密码接口,带上这个 autToken?,authToken 只能被使用一次,验证后就从 redis 删除,authTOken = md5(token+time.Now())
这样设计如何呢?
lasuar   
都对安全性要求较高了,还用 md5? 换一种低碰撞 hash 算法,或者使用一种唯一 id 生成算法,而且最后都要写入 MYSQL 来保证唯一(唯一键),这个表可以是一个月表。
按需求,每个步骤都要返回一个 step_token 给客户端,下次传给服务器,解析后直接进入下一步,所以你的 authToken 是什么用途?对于更改密码这种敏感操作肯定是没有延续的说法吧,一般都是在一个页面中完成,要么是在验证原密码后发送一个带有效期的链接到邮箱,链接中带的也应该是一个 step_token 。
至于包含 4 步的注册功能,服务器可以通过一种状态机模式来实现。比如设计出四种状态:input_email 、verify_email 、verify_phone 、input_passwd ,没带 token 就是第一种状态,否则就是从 token 从解析出到了哪一种状态,然后执行对应的状态流转逻辑。
jokefaker   
本身验证码这件事就发码和验证两件事情, 其他的步骤改密都是应用层业务, 那么安全问题就是, 防止恶意发码攻击, 防止碰撞验证
dododada   
至少 sha256+盐,加上 ip ,imei ,mac ,频率校验等操作,再和上面讲的发码验证分开
您需要登录后才可以回帖 登录 | 立即注册

返回顶部