OTP防重放攻击

OTP本意是一次性口令,比如邮箱验证码,短信验证码,或者根据totp或者hotp生成的默认30秒一变的6位数字。
不过开发者要注意,必须要在验证成功后失效那个验证码,不然就会导致重放攻击。
对于邮箱验证码,服务器可将邮箱和验证码存入json数组中或redis中,验证时查找匹配,成功则删除该项,一般还应配置失效时间。
对于手机验证码,服务器要将手机号和验证码存入json数组中或redis中,验证时查找匹配,成功则删除该项,一般还应配置失效时间。
对于动态口令,则要采用另外的方式:
先准备一个历史成功json数组,每项是一条json,包含用户id,token,验证时刻+禁止重复的时长
每验证成功一条用户和动态口令,则查数据是否有相同id,相同token并且验证时间还在禁止时间段内,如果查到,则认定为重放攻击,记录日志,验证不通过
如果没有查到,那么如果该用户历史列表为空,则添加json记录,否则更新替换记录的token和验证时刻+禁止重复时长。
注意一般动态口令验证会有一个允许的窗口数,以平衡用户时间和服务器时间的差异,这些前后窗口内的token值在当前验证仍然是可以通过的,所以禁止重复时长至少要覆盖之后的窗口时长。如果token时长是30秒,窗口是2,那么禁止重复时长应该设置为90秒。
如果用户数量大,嫌内存空间占用多,可以考虑每次计算时删除已经过期的条目,或者使用redis,在添加记录时定义失效时间。

...
var loginfaillist=[];
var userotpsucclist=[];
...
	if (tokenValidates) {
		let histmatch=userotpsucclist.find(item=>((item.userid==matchuser.uid.toLowerCase())&&(item.token==obj.token)&&(item.invalid>now)))
		if (histmatch!=undefined) {
			addfail(now,clientip);
			logger.error("涉嫌重放攻击 "+matchuser.uid);
			return res.json({ "msg":"涉嫌重放攻击"});
			}
		histmatch=userotpsucclist.find(item=>(item.userid==matchuser.uid.toLowerCase()))
		if (histmatch==undefined) userotpsucclist.push({"userid":matchuser.uid.toLowerCase(),"token":"obj.token","invalid":now+200000})
		else { histmatch.token=obj.token; histmatch.invalid=now+200000; }
		loginfaillist=loginfaillist.filter(itm=>(itm.ip!=req.ip));
		logger.info("认证通过 "+matchuser.username+" "+clientip);
		res.json({"msg":"succ","userid":matchuser.uid.toLowerCase(),"username":matchuser.username});
		}

相关推荐

  1. OTP攻击

    2024-07-14 09:50:07       21 阅读
  2. 智能合约中攻击

    2024-07-14 09:50:07       22 阅读
  3. 接口安全设计之篡改和

    2024-07-14 09:50:07       28 阅读
  4. JWT漏洞攻防策略

    2024-07-14 09:50:07       22 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-14 09:50:07       67 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-14 09:50:07       72 阅读
  3. 在Django里面运行非项目文件

    2024-07-14 09:50:07       58 阅读
  4. Python语言-面向对象

    2024-07-14 09:50:07       69 阅读

热门阅读

  1. 排序之冒泡排序

    2024-07-14 09:50:07       23 阅读
  2. flutter弹窗高度过高,在弹出键盘后布局溢出问题

    2024-07-14 09:50:07       23 阅读
  3. Pytorch lr_scheduler 调整学习率

    2024-07-14 09:50:07       22 阅读
  4. C#中反射与MVC和AOP

    2024-07-14 09:50:07       27 阅读
  5. 新词的发现

    2024-07-14 09:50:07       25 阅读
  6. C++类和对象(一)

    2024-07-14 09:50:07       19 阅读
  7. 【AI原理解析】—对抗学习(AL)原理

    2024-07-14 09:50:07       26 阅读