https://www.cnblogs.com/lori/p/11077161.html

https://blog.coding.net/blog/two-factor-authentication

https://www.cnblogs.com/voipman/p/6216328.html

https://pyotp.readthedocs.io/en/latest/

https://www.zhihu.com/question/20462696

一、概述

双因子认证(Two-factor authentication,也叫2FA),是一种通过组合两种不同的验证方式进行用户身份验证的机制。Google在2011年3月份,宣布在线上使用双因子认证,MSN和Yahoo紧随其后。

双因子认证,除了需要验证用户名密码外,还要结合另外一种实物设备,如Rsa令牌,或者手机。
双因子认证的产品大致可以分成两类:

可以产生token的硬件设备
智能手机的app

手机短信验证码,登录微信公众号时的扫码确认都可以称为双因子认证。本文只介绍OTP一次性密码,也经常被称为token。

二、相关术语

OTP 是 One-Time Password的简写,表示一次性密码。分为以下两种

HOTP 是HMAC-based One-Time Password的简写,表示基于HMAC算法加密的一次性密码。

  HOTP 是事件同步,通过某一特定的事件次序及相同的种子值作为输入,通过HASH算法运算出一致的密码。RFC4226。

TOTP 是Time-based One-Time Password的简写,表示基于时间戳算法的一次性密码。

  TOTP 是时间同步,基于客户端的动态口令和动态口令验证服务器的时间比对,一般每60秒产生一个新口令,要求客户端和服务器能够十分精确的保持正确的时钟,客户端和服务端基于时间计算的动态口令才能一致。 RFC6238。 

三、OTP实现原理


通过上图我们已经看到输入算法的主要有两个元素,一个是共享密钥(也被称作种子),另外一个是计数(或者时间因子),经过特定的算法计算出结果。如果这两个元素全都一致,服务器端和客户端会计算出相同的结果,从而实现认证功能。

四、使用Python实现OTP功能

目前Python上有以下两大模块比较流行,我们以第一个pyotp为例介绍比较常用的TOTP。
https://github.com/pyauth/pyotp
https://github.com/tadeck/onetimepass/

pyotp就是一个python模块,可以直接使用pip安装。

[root@ipcpu-apollo ~]# python
Python 3.6.5 (default, Jul 18 2018, 16:07:41)
[GCC 4.8.5 20150623 (Red Hat 4.8.5-28)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>>
>>> import base64
>>> string='this is s string'
>>> secretKey = base64.b32encode(string.encode(encoding="utf-8"))
>>> print(secretKey)
b'ORUGS4ZANFZSA4ZAON2HE2LOM4======'
>>> import pyotp
>>> totp = pyotp.TOTP(secretKey)
>>> totp.now()
'863055'
>>> totp.verify(863055)
True

五、pyotp和Google Authenticator的兼容

pyotp一个比较大的亮点就是内置了和Google Authenticator的兼容,如下就可以产生Google Authenticator可以识别的字符串

>>> pyotp.totp.TOTP('JBSWY3DPEHPK3PXP').provisioning_uri("alice@google.com", issuer_name="Secure App")
'otpauth://totp/Secure%20App:alice%40google.com?secret=JBSWY3DPEHPK3PXP&issuer=Secure%20App'

把这一串字符生成QR二维码,然后用Google Authenticator扫描就可以用。
服务器端可以用如下方式验证

>>> import pyotp
>>> totp = pyotp.TOTP("JBSWY3DPEHPK3PXP")
>>> print("Current OTP:", totp.now())
Current OTP: 267343

我们总结下,Google Authenticator实际上只存储了共享密钥,并通过共享密钥来产生OTP密码,其他的邮箱、签发人什么的都是为了标示共享密钥用来区分的。

Python使用otp实现二步验证的更多相关文章

  1. java实现谷歌二步验证 (Google Authenticator)

    准备: 一个谷歌二步验证APP,  我用的是ios 身份宝 资料: 1.Google Authenticator 原理及Java实现   //主要参考 https://blog.csdn.net/li ...

  2. PHP设置谷歌验证器(Google Authenticator)实现操作二步验证

    使用说明:开启Google的登陆二步验证(即Google Authenticator服务)后用户登陆时需要输入额外由手机客户端生成的一次性密码.实现Google Authenticator功能需要服务 ...

  3. TOTP算法实现二步验证

    概念 TOTP算法(Time-based One-time Password algorithm)是一种从共享密钥和当前时间计算一次性密码的算法. 它已被采纳为Internet工程任务组标准RFC 6 ...

  4. 使用KeePass管理两步验证

    目录 使用KeePass管理两步验证 两步验证 KeePass中管理两步验证 KeeTrayTOTP插件使用 使用KeePass管理两步验证 文:铁乐与猫 2018-9-9 KeePass 是一款管理 ...

  5. coding如何绑定二次验证码_虚拟MFA_两步验证_身份验证?

    Coding.net 是一个面向开发者的云端开发平台,提供 Git/SVN 代码托管.任务管理.在线 WebIDE.Cloud Studio.开发协作.文件管理.Wiki 管理.提供个人服务及企业管理 ...

  6. 七牛云如何绑定二次验证码_虚拟MFA_两步验证_谷歌身份验证器?

    一般情况下,点账户名——账户设置——安全设置,即可开通两步验证 具体步骤见链接  七牛云如何绑定二次验证码_虚拟MFA_两步验证_谷歌身份验证器?   二次验证码小程序(官网)对比谷歌身份验证器APP ...

  7. humlbe bundle如何绑定二次验证码_虚拟MFA_两步验证_谷歌身份验证器?

    一般点账户名——设置——安全设置中开通虚拟MFA两步验证 具体步骤见链接 humlbe bundle如何绑定二次验证码_虚拟MFA_两步验证_谷歌身份验证器? 二次验证码小程序于谷歌身份验证器APP的 ...

  8. R星游戏如何绑定二次验证码_虚拟MFA_两步验证_谷歌身份验证器?

    一般点账户名——设置——安全设置中开通虚拟MFA两步验证 具体步骤见链接 R星游戏如何绑定二次验证码_虚拟MFA_两步验证_谷歌身份验证器? 二次验证码小程序于谷歌身份验证器APP的优势 1.无需下载 ...

  9. 关于虎信如何绑定二次验证码_虚拟MFA_两步验证_谷歌身份验证器?

    一般点账户名——设置——安全设置中开通虚拟MFA两步验证 具体步骤见链接 虎信如何绑定二次验证码_虚拟MFA_两步验证_谷歌身份验证器? 二次验证码小程序于谷歌身份验证器APP的优势 1.无需下载ap ...

随机推荐

  1. python之paramiko 远程执行命令

    有时会需要在远程的机器上执行一个命令,并获得其返回结果.对于这种情况,python 可以很容易的实现. 1 .工具 Python paramiko 1) Paramiko模块安装 在Linux的Ter ...

  2. 客户端注册Cannot execute request on any known server解决

    在对eureka注册中心服务端添加安全验证后,新版本springcloud出现一个问题就是,在客户端注册到服务中心时报了一个错:Cannot execute request on any known ...

  3. C99 inline关键字

    C99 inline 一直以来都用C++用得比较多,这个学期做操作系统的课设用回了C,结果一波內联函数居然链接不过去--查了查资料,C99引入的inline和C++的inline语义区别是很大的,我算 ...

  4. 移动端tab切换时下划线的滑动效果

    1.当前 tab 出现下划线的同时,前一个下划线同时消失(出现方向与消失方向保持一致),伴随过渡效果. <!DOCTYPE html><html lang="en" ...

  5. axios跨域问题(包括开发环境和生产环境)

    之前写过一篇axios跨域问题,写的过于片面,没有考虑过实际开发中遇到的问题,以及如何全局使用axios,这次再写一篇,以后再有新发现再更新... 1.在static文件夹下新建/js/config. ...

  6. 用jquery写出图片自动轮播效果

    相关代码如下,只要把代码粘贴进编辑器,修改图片路径,即可看到效果. 1.html部分 <body>   <ul class="banner">   < ...

  7. centos7搭建docker并部署lnmp (转)

      1.首先呢先更新yum源 yum -y update 2.1.安装docker存储库 yum install -y yum-utils \ device-mapper-persistent-dat ...

  8. 使用remix的solidity在线编译环境部署一个faucet合约

    一.浏览器打开https://remix.ethereum.org 地址 点击"+"新建一个sol文件,命名为faucet.sol 然后在代码区输入solidity代码 选择相关插 ...

  9. Webpack编译提示内存溢出解决方案

    在项目开发中,随着业务需求的复杂项目随之增大,再加上同一个文件被引用次数过于频繁在开发编译或者上线打包时经常会出现如下错误: 这个报错的意思就是Node内存不足所导致的,我们都知道 Node 是基于V ...

  10. LoadRunner(1)

    性能测试:HP LoadRunner11 一.初步概念: 1.功能测试:测试产品的功能是否满足功能需求. 如:ATM取款(在线取款)是否成功或转账操作是否成功 -- 一个用户 2.性能测试:测试产品的 ...