从Github登录的双因子验证到基于时间戳的一次性密码:2FA、OTP与TOTP

这篇具有很好参考价值的文章主要介绍了从Github登录的双因子验证到基于时间戳的一次性密码:2FA、OTP与TOTP。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Github于2023-03-09推出一项提高软件安全标准的措施,所有在Github上贡献过代码的开发人员在年底前必须完成 2FA(Two-factory authentication,双因子认证)。初听此事之时,不以为意,因为自己之前就知道双因子认证,就是说登录账号时,不仅需要密码,还需要额外的认证方式,我们熟知的短信验证码就是其中的一种方式。

2FA

但当我准备启用Github账号的2FA时,我却发现Github虽然提供了SMS/Text message的选项,但并不支持国内手机号码,也就是说大陆无法收到验证码。Github支持的二次验证方式如下

  • Authenticator app
  • SMS/Text message
  • Security keys
  • Github Mobile

移动端的Github应用也可以用来做二次验证,但是为了安全,我的手机通常没有搭载科学上网的软件,此项也被PASS。这时只能使用Authenticator app的方式,采用了 OTP(One Time Password,一次性密码) 算法。

github二次验证器,安全漫谈,github

介绍完2FA场景,我们就知道OTP原理就是,用户在首次登录或者注册时,云端不仅保存用户的密码,还会生成一个密钥,服务器通常使用二维码的方式呈现给用户,这个密钥需要用户使用客户端保存,也就是需要支持OPT的程序去扫描二维码。这样云侧端侧拥有了同样的密钥,就可以基于相同的算法生成相同的一次性密码。通常这个算法就是TOTP(Time-based One-time Password,基于时间戳的一次性密码)。

TOTP

TOTP定义在 RFC 6238,附录给出了JAVA实现TOTP的代码,读者可以自取。其实现算法如下

TOTP=HMAC-SHA-1(K, (T - T0)/X)

TOTP基于具有时间戳计数器的OTP(一次性密码),其中K为共享密钥,T为当前时间戳,T0为开始的时间戳,X为时间步长。

  • 密钥生成:在为帐户设置TOTP时,将生成一个唯一的密钥。该密钥在用户设备和认证服务器之间共享。
  • 时间同步:用户设备和认证服务器需要同步到相同的时间源。TOTP算法依赖于当前时间来生成一次性密码。
  • OTP生成:TOTP算法将密钥和当前时间结合起来,应用Hash函数生成一次性密码。此密码通常包含6-8位数字,并具有有限的有效期,例如30或60秒。
  • OTP验证:当用户尝试登录时,输入常规密码以及由TOTP应用程序或设备生成的一次性密码。然后,认证服务器根据共享密钥和当前时间独立生成预期的OTP。如果用户输入的OTP与服务器生成的OTP匹配,则授权访问。

2FA/OTP客户端

Github推荐的都是付费客户端,例如authy,如果你是土豪,请随意。很显然本人不是,所以花费了一些时间收集一些比较好用的工具,包括浏览器插件、APP以及桌面客户端,很多密码管理器都有计算OTP验证码的功能,在使用的同时,我们也要考虑安全性。

  • 神锁离线版,十年前的国内一家创业公司,转型期间的作品,我看了一些他们开发的技术博客,还是很懂安全和客户隐私的,并且隐私声明中声称未收集任何个人数据。
  • 微信小程序Authly,安全性未知,好处是可以绑定微信账号,管理多个密码。
  • 身份验证器-Chrome插件,离线运行,想在多个设备上登录Github,可能就犯难了。
  • Microsoft Authenticator,微软官方出品的身份验证器,可账号同步,如果你相信大厂的实力和安全性,不二之选,缺点是过于臃肿(278.89MB)。
  • Google Authenticator,谷歌官方出品的身份验证器,可账号同步,相比于微软,没有科学上网的话,不建议使用Google的产品。

总结

客户端在离线情况下,仍然可以生成与服务器一致的一次性密码,这是由于他们最初都约定好了一个共享密钥,由此密钥+时间戳经过相同的算法计算而来。一次性密码是双因子验证的有力补充,当然一次性密码也可以用在其他领域,不仅仅是2FA。例如针对智能门锁,我们可以利用TOTP生成临时密码,给清洁工自行开门;工商银行网银的动态令牌生成器在离线场景下仍然可以生成动态密码。文章来源地址https://www.toymoban.com/news/detail-769826.html

到了这里,关于从Github登录的双因子验证到基于时间戳的一次性密码:2FA、OTP与TOTP的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C++时间和时间戳的转换

    编译运行结果 结果如下: patten@patten-hp:~/workspace/xjCollide$ g++ timestamp.cpp -std=c++11 patten@patten-hp:~/workspace/xjCollide$ ./a.out 1549133300: 2019-02-03 02:48:20 patten@patten-hp:~/workspace/xjCollide$ 编译运行结果 结果如下: patten@patten-hp:~/workspace/others/cpp/demo$ g++ -g -std=c++11 main.cpp patten@patten-hp:~/workspace

    2024年02月06日
    浏览(63)
  • Linux下 时间戳的转化

    Linux下一般用date 记录当前时间,尤其是我们需要保存测试log的时候,或者设计一个跑多长时间的脚本都需要时间戳。下面看一下平时最常用的几种写法 1 date “+%Y-%m-%d %H:%M” 显示具体时间 2 修改时间 date -s 3 date +%s :当前时间的时间戳 显示具体时间的时间戳 date -d “2021-08-29

    2024年02月13日
    浏览(35)
  • 使用php 获取时间今天、明天、昨天时间戳的详解

    使用php获取时间今、明天、昨天时间戳 本函数预期接受一个包含美国英语日期格式的字符串并尝试将其解析为 Unix 时间戳(自 January 1 1970 00:00:00 GMT 起的秒数),其值相对于 now  参数给出的时间,如果没有提供此参数则用系统当前时间。 ----------------------------------------------

    2024年02月09日
    浏览(55)
  • jenkins 日志输出显示时间戳的方式

    网上很多方式比较片面,最新版插件直接使用即可无需更多操作。 使用方式如下: 系统设置-找到 Timestamper 勾选 Enabled for all Pipeline builds 也可修改时间戳格式。 帮助信息中显示 When checked, timestamps will be enabled for all Pipeline builds. There is no need to use the timestamps {…} step in Scripte

    2024年02月11日
    浏览(62)
  • PHP实现获取毫秒时间戳的方法

    PHP获取毫秒时间戳,利用microtime()函数 php本身没有提供返回毫秒数的函数,但提供了一个microtime()函数,借助此函数,可以很容易定义一个返回毫秒数的函数。 php的毫秒是没有默认函数的,但提供了一个microtime()函数,该函数返回包含两个元素,一个是秒数,一个是小数表示

    2024年02月15日
    浏览(41)
  • js/javascript获取时间戳的5种方法

    以下便是干货 1.获取时间戳精确到秒,13位 2.获取时间戳精确到毫秒,13位 3.获取时间戳精确到毫秒,13位 4.获取时间戳精确到毫秒,13位 5.获取时间戳精确到毫秒,13位 其它 在开发的中需要精确到秒的时候,推荐使用 第1种方法,也需要除以1000才行,如果是需要时间戳毫秒的推荐 +new D

    2024年02月11日
    浏览(44)
  • Python中获取时间戳的几种方法

    时间戳是指从某个特定的时间点(通常是1970年1月1日00:00:00 UTC)到现在的总秒数。在Python中,我们可以使用多种方法获取时间戳。本文将介绍三种常用方法:使用time模块、使用datetime模块和使用dateutil模块。同时,还会对比它们的优缺点,并介绍其他获取时间戳的方法以及如

    2024年02月08日
    浏览(56)
  • 【Maven】-- 打包添加时间戳的两种方法

          在执行  mvn clean package -Dmaven.test.skip=true 后,生成的 jar 包带有自定义系统时间。     使用系统时间戳,但有一个问题,就是默认使用 UTC+0 的时区。举例:当前时北京时间,而使用该方法时,生成的时间是 0时区的时间,而不是 UTC+8  的北京时间。      pom.xml 配置如下

    2024年01月24日
    浏览(51)
  • 音视频基础知识-时间戳的理解

    问题背景: 凡是和流媒体和音视频打交道,时间戳基本是一个必须深刻理解的概念。你会在各种各样的传输协议和封装格式中看到这个东西,而且表现形式还不一样。其次这个概念会涉及到音视频播放的同步问题,也会影响音视频播放的控制问题。前者说的是音画同步,后者

    2023年04月08日
    浏览(47)
  • 小白弄明白了 unix 时间戳的转换问题

    小白对于将 unix 时间戳转换为日期时间和使用日期时间转换为 unix 时间戳,在项目中见到过很多,每次使用时不是用现有的方法转换就是网上搜索方法。 小白见过各种转换方式觉得moment库很是方便,但是用法较多,所以小白决定整理一下。以后再遇到时间日期转换可能手写代

    2024年02月10日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包