time-based基于google key生成6位验证码(google authenticator)

由于公司服务器启用了双因子认证,登录时需要再次输入谷歌身份验证器生成的验证码。而生成验证码是基于一套固定的算法的,以当前时间为基础,基于每个人的google key去生成一个6位的验证码

以下为python3实现

import hmac
import base64
import struct
import hashlib
import time

def cal_google_code(secret_key):
    duration_input = int(time.time())//30
    key = base64.b32decode(secret_key)  # Length of the key must be a multiplier of eight
    msg = struct.pack(">Q", duration_input)
    google_code = hmac.new(key, msg, hashlib.sha1).digest()
    o = google_code[19] & 15
    google_code = str((struct.unpack(">I", google_code[o:o+4])[0] & 0x7fffffff) % 1000000)
    if len(google_code) == 5:  # Only if length of the code is 5, a zero will be added at the beginning of the code.
        google_code = ‘0‘ + google_code
    return google_code

首先算法对google key的长度是有要求的。key的长度必须是8的倍数,所以如果运维给的key不符合要求,需要在后面补上相应个数的"="。

按照此算法,生成的验证码未必是6位,需要在前面补0。

原文地址:https://www.cnblogs.com/wuhuohanke/p/10082401.html

时间: 2024-10-09 22:30:45

time-based基于google key生成6位验证码(google authenticator)的相关文章

js随机生成4位验证码

方法一: /*随机生成4位验证码*/ /*step1:将所有字母,数字装入一个数组备用*/ var codes=[]; //数字:48-57;unicode编码 for(var i=48;i<57;codes.push(i),i++); /*console.log(codes);*/ //大写字母:65-90;unicode编码 for(var i=60;i<90;codes.push(i),i++); //小写字母:97-122;unicode编码 for(var i=97;i<122

随机生成4位验证码,由用户输入并验证是否输入正确,如果输入错误就生成新的验证码让用户重新输入,最多输入5次

1 //四位随机验证码 2 Random ran=new Random(); 3 String str1 = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIGKLMNOPQRSTUVWXUZ"; 4 char [] a=new char[4]; 5 for(int i=0;i<4;i++) 6 { 7 a[i]=str1.charAt(ran.nextInt(62)); 8 } 9 10 StringBuilder rzm1= new

Python随机数random模块学习,并实现生成6位验证码

一.前言 学习python随机数random模块的使用 ,并使用模块中的函数,实现6位验证码生成 二.random模块 1.random.random() 返回0-1直接的随机数,类型为float >>>print(random.random()) 0.1259184691662908 2.random.randint(1, 8) 返回1-8直接的随机数,包括8 >>>print(random.randint(1, 8)) 3 3.random.choice() 从一个

随机生成4位验证码

package com.hanqi; import java.util.*; public class yanzhengma { public static void main(String[] args) { // TODO 自动生成的方法存根 String str="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; int ary[]=new int[4]; for (int i = 0; i <

Python 生成4位验证码图片

import randomimport stringfrom PIL import Image,ImageDraw,ImageFont,ImageFilter # 字体的位置font_path = "/Library/Fonts/Arial.ttf"# 验证码的位数number = 4# 生成图片的大小size = (100,30)# 图片背景颜色-白色bgcolor = (255,255,255)# 验证码字体颜色--蓝色fontcolor = (0,0,255)# 干扰线的颜色--

随机生成4位验证码,输入验证码与生成的比较,最多输入5次

package com.hanqi.lianxi;import java.util.Random;import java.util.Scanner;public class yanzhengma{ public static void main(String[] args) { String str ="0123456789abcdefghigklmnopqrstuvwxyzABCDEFGHIGKLMNOPQRSTUVWXYZ"; char[] array = new char[4];

生成4位验证码,最多输入5次

char []arry=new char[4]; Random ran=new Random(); String str="0123456789abcdefghijklmnopqistuvwxyz"; for(int i=0;i<4;i++) { arry[i]=str.charAt(ran.nextInt(36)); System.out.print(arry[i]); } Scanner sc=new Scanner(System.in); System.out.print(

java练习 随机生成4位验证码

String str="abcdefghigklmnopqrstuvwxyzABCDEFGHIGKLMNOPQRSTUVWXYZ0123456789"; Random r=new Random(); String arr[]=new String [4]; String b=""; for(int i=0;i<4;i++) { int n=r.nextInt(62); arr[i]=str.substring(n,n+1); b+=arr[i]; } Syst

在使用Math.random()生成6位随机数遇到的问题,并成功得到6位随机数

最近在做卫生局的一个考务网时需要实现一个短信发送验证码的功能,因此就必须使用到随机生成6位验证码的功能,开始觉的简单的,随便写了个 int i=(int)(Math.random()*1000000+100000); String messageCode = String.valueOf(i); 然后测试发送了下,是发送了6位随机数,以为是正确的,但在之后的反复测试中忽然发现这个验证码有时会出现7位的,然后去看代码感觉没问题啊, Math.random()是产生0.0到1.0之间的doule的随