首页 > 编程语言 >算法~totp用作签名防止url被复用

算法~totp用作签名防止url被复用

时间:2023-11-16 20:23:16浏览次数:36  
标签:窗口 currentTime url base32Key 复用 long totp result

之前写过关于totp的文章,对它的基础有不清楚的同学,可以先看我的这篇文章《TOTP基础一》《TOTP基础二

想到的问题

因为totp是把时间分成了一个一个小的时间窗口,当生成totp的服务器和校验totp的服务器不在一起时间窗口,就会出现验证失败的问题,这是不可避免的,时间戳是一个long类型的数字,当这个数字进行totp运算后,落在哪个窗口里是确定的,但你的时间戳数字是不确定的,因为你不知道用户在什么时间触发totp这个生产的动作。

时间窗口

从下面的图中可以看到,时间两个窗口总会有一个交叉,谁赶上了都不一定,所以我们要解决这个不一定的问题。

最多跨一个窗口

我们的生成totp端和校验totp端,他们最多相差一个窗口,当然这也取决于,生产和校验的时间差和你的窗口大小,正常情况下相差1个窗口,所以我们比较上一个和下一个窗口即可。

/**
   * 生成一组TOTP,窗口大小5分钟,产生8位的动态码.
   * @param base32Key
   * @return
   */
  public static List<String> generateTOTPList(String base32Key) {
    long currentTime = System.currentTimeMillis();
    long prevTime = currentTime - 30 * 1000;
    long nextTime = currentTime + 30 * 1000;
    List<String> result = new ArrayList<>();
    result.add(generateTOTP(prevTime, base32Key, 300, 8));
    result.add(generateTOTP(currentTime, base32Key, 300, 8));
    result.add(generateTOTP(nextTime, base32Key, 300, 8));
    return result;
  }

我们在进行校验时,用这3个totp码与目标totp进行对比,有一个满足,就说明是合法的!即,我们的容错率是前后1个窗口。

标签:窗口,currentTime,url,base32Key,复用,long,totp,result
From: https://www.cnblogs.com/lori/p/17837178.html

相关文章

  • 使用CURL获取速卖通详情的API接口
    作为一名程序员,我们经常需要与各种API接口打交道,以获取所需的数据并集成到我们的应用程序中。速卖通(AliExpress)是一个流行的跨境电商平台,提供了丰富的API接口供开发者使用。本文将介绍如何使用curl命令通过速卖通的API接口获取商品详情。在开始之前,确保你已经注册了速卖通开发者账......
  • php封装的curl请求方法
    get请求function curlGet($url, array $header = array(), $timeout = 5){    $ch = curl_init();//初始化    curl_setopt($ch, CURLOPT_URL, $url);//抓取指定网页    curl_setopt($ch, CURLOPT_HEADER, 0);//是否显示头信息,1显示,0不显示    ......
  • 软件测试|Python urllib3库使用指南
    简介当涉及到进行网络请求和处理HTTP相关任务时,Python的urllib3库是一个强大且灵活的选择。它提供了一种简单的方式来执行HTTP请求、处理响应和处理连接池,使得与Web服务进行交互变得更加容易。本文将详细介绍如何使用urllib3库进行网络请求。安装urllib3首先我们需要安装urlli......
  • 解决requests库的urllib3版本冲突问题
    每个加班的夜晚,都是我和bug的较量。当我坐在电脑前,灯光昏暗,空气凝固,只有键盘敲击的声音回荡在空旷的办公室中。我渐渐地陷入了与无数个请求的斗争中。这些请求来自各种各样的客户端,充满了各种各样的需求。每个请求都是一个挑战,需要我用技术和创造力去解决。这个过程充满了曲折和挫......
  • requests 库更新:兼容最新 urllib3 版本及相关库
    #升级支持requests库更新:兼容最新urllib3版本及相关库            解决方案        对于这个问题,我们可以通过修改setup.py文件来解决。在setup.py文件中,我们将urllib3的版本范围从1.21.1到1.26改为1.21.1到最新版本。这是因为......
  • 实验八. urllib模块、requests模块+BeautifulSoup模块使用、Feapder框架
    一、实验目标:熟悉模块的的用法,练习编写爬虫二、实验要求:编写代码,完成功能三、实验内容:(1)使用urllib模块或request模块读取网页内容,并利用BeautifulSoup模块进行内容解析,编写爬虫从http://www.cae.cn/cae/html/main/col48/column_48_1.html爬取中国工程院院士信息模......
  • Pset_AnnotationContourLine
    Pset_AnnotationContourLinePSET_TYPEDRIVENOVERRIDE / IfcAnnotation / ContourLine注释等高线:指定具有单个一致测量值的标准曲线的参数。: Définitiondel'IAI:paramètresspécifiquesàunecourbestandardquiaunevaleursimpleetcohérente.......
  • cshtml页面中动态生成URL,Url.RouteUrl()与 Url.Action()有什么区别
    原文链接:http://cn.voidcc.com/question/p-yrfdusit-kx.htmlRouteUrl根据路由名称生成url。如果您有多个参数相似的路由,则Action方法可能会选择错误的路由-它会根据路由定义的顺序工作。这可能发生在您的路线具有可选参数时。如果您想确保使用某个路由网址,您需要呼叫RouteUrl......
  • Git更改远端仓库URL
    如果你想要更改远程仓库的URL,可以使用以下命令:bashCopycodegitremoteset-urlorigin新的仓库URL如果你希望使用新的远程仓库,你可以更改远程仓库的名称,然后再添加新的远程仓库。例如:bashCopycode#更改远程仓库的名称gitremoterenameoriginold-origin#添加新......
  • Python curlify 模块将请求对象转换为 cURL 命令
    一、curlify是一个Python模块,它可以将Python的requests库中的请求对象转换为cURL命令的形式。使用curlify可以方便地将Python代码中的请求转化为可执行的cURL命令,方便调试和测试。以下是curlify模块的简单使用步骤:安装curlify模块。可以使用pip命令进行......