动态令牌 (谷歌身份验证器)的实现
动态令牌-(OTP,HOTP,TOTP)-基本原理: https://www.cnblogs.com/navysummer/p/11943319.html
实现原理: https://blog.csdn.net/weixin_39868414/article/details/110985973
1、服务端首先要约定一个base32的密钥,并且把这个密钥与某个账户关联。
2、在页面显示一个二维码,内容是一个URI地址(otpauth://totp/账号?secret=密钥)。
3、通过手机端的谷歌身份验证器软件扫描这个二维码,使密钥保存在手机客户端
# -*- coding: utf-8 -*-
import base64
import hashlib
import hmac
import time
import datetime
import random as _randomdef byte_secret(secret):missing_padding = len(secret) % 8if missing_padding != 0:secret += '=' * (8 - missing_padding)return base64.b32decode(secret, casefold=True)def int_to_bytestring(i, padding=8):result = bytearray()while i != 0:result.append(i & 0xFF)i >>= 8return bytes(bytearray(reversed(result)).rjust(padding, b'\0'))#根据约定的密钥计算当前动态密码def generate_otp(secret):for_time = datetime.datetime.now()i = time.mktime(for_time.timetuple())input = int(i / 30)digest = hashlib.sha1digits = 6if input < 0:raise ValueError('input must be positive integer')hasher = hmac.new(byte_secret(secret),int_to_bytestring(input),digest)hmac_hash = bytearray(hasher.digest())offset = hmac_hash[-1] & 0xfcode = ((hmac_hash[offset] & 0x7f) << 24 |(hmac_hash[offset + 1] & 0xff) << 16 |(hmac_hash[offset + 2] & 0xff) << 8 |(hmac_hash[offset + 3] & 0xff))str_code = str(code % 10 ** digits)while len(str_code) < digits:str_code = '0' + str_codereturn str_code#随机生成一个base32密钥def random_base32(length=16, random=_random.SystemRandom(), chars=list('ABCDEFGHIJKLMNOPQRSTUVWXYZ234567')):return ''.join(random.choice(chars)for _ in range(length))x=random_base32()
print(x)
y=generate_otp(x)
print(y)
如何使用:
【1】服务器端,使用random_base32函数生成一个随机密钥,并且把这个密钥与某个账户关联。
【2】以下A/B方案中选择其中一个:
A、在页面上显示这个密钥,用户复制这个密钥,粘帖到手机端的谷歌身份验证器。
B、在页面显示一个二维码,内容是一个URI地址(otpauth://totp/账号?secret=密钥)。用户通过手机端的谷歌身份验证器软件扫描这个二维码,使密钥保存在手机客户端。
服务端验证:
把上面生成的密钥传入generate_otp函数,可计算出当前动态密码。
动态令牌 (谷歌身份验证器)的实现相关推荐
- 使用谷歌身份验证器增强SSH安全
一般大家都是使用账号和密码远程SSH登录管理服务器.但SSH账号和密码很容易泄露,或者经常遭遇暴力破解.咨询过前同事赛赛,他们目前使用了谷歌身份验证器.查看了谷歌身份验证器的github和其它网上文档 ...
- 如何为SSH登录建立双因子验证机制(谷歌身份验证器)?
前言 默认情况下,SSH已经在远程机器之间使用安全的数据通信;但是如果你想为自己的SSH连接添加另外某种安全层,可以添加谷歌身份验证器(Google Authenticator)双因子验证模块,该模块 ...
- 使用谷歌身份验证器(Google Authenticator)保护你的后台
为何要使用谷歌身份验证器 普通的网站只使用账号.密码.图形验证码进行后台登录.根据我(作为站长)多年的经验来看,这种方式安全性很低,尤其是使用 http 协议,明文的帐号和密码相当于在网络上裸奔.如果 ...
- 【SpringBoot】61、SpringBoot中使用谷歌身份验证器(Google Authenticator)实现二步身份验证
Google 身份验证器 Google Authenticator 是谷歌推出的基于时间的一次性密码 (Time-based One-time Password,简称 TOTP),只需要在手机上安装该 ...
- 谷歌身份验证器 手表_6条使您的三星手表更加Google-y的提示
谷歌身份验证器 手表 Samsung 三星 Samsung Galaxy watches are, arguably, the best smartwatches for Android phones ...
- 使用C++实现谷歌身份验证器(Google Authenticator)
使用C++实现谷歌身份验证器(Google Authenticator) 本机环境: windows10 x64位运行环境 1.进入网站:http://slproweb.com/products/Wi ...
- 二次验证码小程序与谷歌身份验证器不同点是?
名称1[二次验证码]小程序 名称2 谷歌身份验证器(Google Authenticator) 粗略对比两个产品异同 [二次验证码]小程序 搜索:微信搜索.微信目前65个小程序入口,倒是容易找到它 使 ...
- Google Authenticator windows client 谷歌身份验证器 windows 电脑端
谷歌身份验证器现在有安卓客户端和ios客户端,本人开发了一个windows客户端,基于 .NETFramework v4.7 开发,已在 github 上开源,可以在 github 上直接下载. gi ...
- 谷歌身份验证器代码实现
手机下载谷歌身份验证器,无需联网也可以用. 工具类 public class GoogleAuthenticator{// 生成的key长度( Generate secret key length)p ...
最新文章
- windows10 中 python3 离线 安装包,没有 网络 的 情况下 安装 whl包
- mysql Replication机制
- TCP/IP协议模型详解
- 常用API-1(Object类、String类、StringBuffer类、StringBuilder类)
- error while loading shared libraries:libmysqlclient.so.18 错误
- Java 的Comparator比较器用法
- 树莓派开机运行python脚本_【树莓派】开机自启动脚本方法之一(.Desktop文件)...
- 【转载】关于HttpClient 接口方法总结
- 腾讯看点CTO徐羽: QQ浏览器背后的推荐AI中台 | AICon
- 原型模式(Prototype)解析例子
- 项目管理 : 需求管理的6个流程
- 微信小程序引入UI组件库
- css3 呼吸的莲花_心肾呼吸法—莲花能量冥想*
- 弱水三千,只取一瓢,当图像搜索遇见PostgreSQL(Haar wavelet)
- 意图推荐 Metapath-guided Heterogeneous Graph Neural Network for Intent Recommendation
- 15 个边玩游戏边学编程的网站
- 输入N,求N以内(包括N)的质数之和
- 李白《月下独酌-花间一壶酒》的UML建模
- 关于我使用vue-quill-editor遇到的一些“坑”
- matlab psb,基于Matlab_PSB的电路仿真分析