从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,一次性密码) 算法。

蓝色表示首次注册或者登录,绿色表示后续登录

介绍完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生成临时密码,给清洁工自行开门;工商银行网银的动态令牌生成器在离线场景下仍然可以生成动态密码。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/160397.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++之常用的排序算法

C之常用的排序算法 sort #include<iostream> using namespace std; #include<vector> #include<algorithm> #include<functional> void Myptint(int val) {cout << val << " "; }void test() {vector<int> v;v.push_back(…

打破应用孤岛,低代码平台效力几何?

关于低代码开发平台&#xff0c;争论有很多。有人认为它是第四代编程语言&#xff0c;有人认为它是开发模式的颠覆&#xff0c;有人认为它是企业管理模式的变革&#xff0c;也有人认为它空有其表。 不过&#xff0c;至少在目前看来&#xff0c;低代码无疑是火爆的&#xff0c;…

整理MLAI学习路径图

干货分享&#xff1a; 下面给出一个笔者自己整理的GitHub仓库&#xff1a;https://github.com/isLinXu/awesome-road-map&#xff0c;里面包含了一些可供参考的学习路径和思维导图&#xff0c;并整理微软、meta、谷歌、Kaggle以及华为、百度、阿里、腾讯、讯飞等相关的学习资源…

一文搞懂什么是 GNU/Linux 操作系统

Author&#xff1a;rab 目录 前言一、UNIX二、Linux三、GNU 前言 你是否经常看见或听说过这么一句话&#xff1a;这是一个类 Unix 的 GNU/Linux 操作系统&#xff0c;你是怎么理解这句话的呢&#xff1f;想要搞懂这句话的含义&#xff0c;你需要了解以下三点基本常识。 一、U…

linux ld 链接器学习笔记

ld链接器笔记 1. 首先编写一段汇编代码 这里的汇编语法时 AT&T语法,是gcc原生支持的语法,底层使用 gas(gnu assembler) 完成汇编,相较于 Intel x86语法, AT&T 语法要更加古老,因此大多数人更加偏向于使用 Intel 的语法. nasm 编译器支持x86语法.自从2.10版本&#xf…

MySQL 事务的底层原理和 MVCC(二)

7.2. undo 日志 7.2.1. 事务回滚的需求 我们说过事务需要保证原子性&#xff0c;也就是事务中的操作要么全部完成&#xff0c;要么什么也不做。但是偏偏有时候事务执行到一半会出现一些情况&#xff0c;比如&#xff1a; 情况一&#xff1a;事务执行过程中可能遇到各种错误&a…

ORB-SLAM3在windows11下的编译使用

01 写在前面 近期在学习SLAM&#xff0c;想部署一下ORB-SLAM3&#xff0c;但是自己电脑是win11系统&#xff0c;因此就想着在win11上部署一下。但是网上看了一些教程&#xff0c;有一些博客&#xff0c;但是可能不适合我这种情况把&#xff0c;就很纠结。先说下结果&#xff0…

【python基础(三)】操作列表:for循环、正确缩进、切片的使用、元组

文章目录 一. 遍历整个列表1. 在for循环中执行更多操作2. 在for循环结束后执行一些操作 二. 避免缩进错误三. 创建数值列表1. 使用函数range()2. 使用range()创建数字列表3. 指定步长。4. 对数字列表执行简单的统计计算5. 列表解析 五. 使用列表的一部分-切片1. 切片2. 遍历切片…

【并发编程】ThreadLocal详解与原理

&#x1f4eb;作者简介&#xff1a;小明Java问道之路&#xff0c;2022年度博客之星全国TOP3&#xff0c;专注于后端、中间件、计算机底层、架构设计演进与稳定性建设优化&#xff0c;文章内容兼具广度、深度、大厂技术方案&#xff0c;对待技术喜欢推理加验证&#xff0c;就职于…

【电路笔记】-电流源

电流源 文章目录 电流源1、概述1.1 理想电流源1.2 实际电流源1.3 连接规则 2、依赖电流2.1 压控电流源2.2 电流控制电流源 3、总结 本文为前面文章 电压源的延续&#xff0c;我们将在本文介绍电流源。 与电压源的情况类似&#xff0c;我们将首先介绍理想电流源的概念&#xff…

MySQL 8.2 Command Line Client打开时一闪而过闪退问题

MySQL8.2安装成功后&#xff0c;发现打开MySQL 8.0 Command Line Client时出现一闪而过&#xff0c;打不开的情况。 解决方案&#xff1a; 1、打开MySQL 8.2 Command Line Client文件位置 2、右键选择属性 3、复制它的目标 4、我复制下来的目标路径是这样的&#xff0c;"…

关于 Docker

关于 Docker 1. 术语Docker Enginedockerd&#xff08;Docker daemon&#xff09;containerdOCI (Open Container Initiative)runcDocker shimCRI (Container Runtime Interface)CRI-O 2. 容器启动过程在 Linux 中的实现daemon 的作用 Docker 是个划时代的开源项目&#xff0c;…

[计算机网络实验]头歌 实验二 以太网帧、IP报文分析(含部分分析)

目录 第1关&#xff1a;Wireshark基本使用入门 【实验目的】 【实验环境】 【本地主机、平台虚拟机之间数据传递】 wireshark基本用法】 1、wireshark主界面 2、抓取分组操作 3、Wireshark窗口功能 4、筛选分组操作 【实验操作】 ​编辑 第2关&#xff1a;Ethernet帧…

基于Towers of Binary Fields的succinct arguments

1. 引言 Ulvetanna团队Benjamin E. Diamond和Jim Posen 2023年论文《Succinct Arguments over Towers of Binary Fields》&#xff0c;开源代码见&#xff1a; https://github.com/recmo/binius&#xff08;Rust Sage&#xff09;【基于plonky3等库】 在该论文中&#xff1…

Apache POI简介

三十二、Apache POI 32.1 介绍 Apache POI 是一个处理Miscrosoft Office各种文件格式的开源项目。简单来说就是&#xff0c;我们可以使用POI在Java程序中对Miscrosoft Office各种文件进行读写操作。 一般情况下&#xff0c;POI都是用于操作Excel文件。 Apache POI 的应用场…

基于区域划分的GaN HEMT 准物理大信号模型

GaN HEMT器件的大信号等效电路模型分为经验基模型和物理基模型。经验基模型具有较高精度但参数提取困难&#xff0c;特别在GaN HEMT器件工艺不稳定的情况下不易应用。相比之下&#xff0c;物理基模型从器件工作机理出发&#xff0c;参数提取相对方便&#xff0c;且更容易更新和…

火山引擎 ByteHouse 的增强型数据导入技术实践

作为企业数字化建设的必备要素&#xff0c;易用的数据引擎能帮助企业提升数据使用效率&#xff0c;更好提升数据应用价值&#xff0c;夯实数字化建设基础。 数据导入是衡量OLAP引擎性能及易用性的重要标准之一&#xff0c;高效的数据导入能力能够加速数据实时处理和分析的效率。…

Sa-Token 整合Java17和SpringBoot

目录 前言引入项目开启登录认证路由拦截鉴权解决兼容问题总结 前言 之前无意中发现Sa-Token权限认证框架&#xff0c;项目十分好用。 项目地址&#xff1a; https://github.com/dromara/sa-token 官网地址&#xff1a; https://sa-token.cc/doc.html#/start/example 我的个人…

不停的挖掘硬盘的最大潜能

从 NAS 上退休的硬盘被用在了监控的存储上了。 随着硬盘使用寿命的接近尾声&#xff0c;感觉就是从高附加值数据到低附加值数据上。监控数据只会保留那么几个月的时间&#xff0c;很多时候都会被覆盖重新写入。 有人问为什么监控数据不保留几年的&#xff0c;那是因为监控数据…

java_函数式接口

文章目录 一、什么是函数式接口二、四大核心函数式接口三、使用举例 一、什么是函数式接口 如果一个接口只有一个抽象方法&#xff0c;那么该接口就是一个函数式接口函数式接口的实例可以通过 lambda 表达式、方法引用或者构造方法引用来创建如果我们在某个接口上声明了 Funct…