两步验证使用示例

kio 1月前 161

看到光庆大佬留言说最好来一个示例,那么它来了

 import win.ui;
/*DSG{{*/
mainForm = win.form(text="使用谷歌身份验证器扫码查看";right=547;bottom=381)
mainForm.add(
button={cls="button";text="TOTP验证";left=48;top=320;right=226;bottom=357;z=3};
button2={cls="button";text="HOTP验证";left=328;top=320;right=506;bottom=357;z=6};
edit={cls="edit";text="Edit";left=48;top=256;right=226;bottom=294;edge=1;z=2};
edit2={cls="edit";text="Edit";left=328;top=256;right=506;bottom=294;edge=1;z=5};
plus={cls="plus";left=40;top=16;right=243;bottom=211;z=1};
plus2={cls="plus";left=312;top=16;right=515;bottom=211;z=4};
static={cls="static";text="请使用谷歌身份验证器扫码添加";left=186;top=223;right=389;bottom=251;transparent=1;z=7}
)
/*}}*/

//谷歌身份验证器下载地址:https://137.lanzouw.com/iqpY510vu8bc
import godking.message;
import kio.otp;
import win.clip;
import qrencode.bitmap;
var msg=godking.message(mainForm);
var key=kio.otp.GenerateRandomKey(); //生成随机key
//时间验证totp
var totp=kio.otp.Totp(key);
var rfc=kio.otp.VerificationWindow(1,1);//根据RFC建议设置允许一个步长的延迟
var timeWindowUsed=com.long(0);
var qrstr=kio.otp.OtpUri(key,"user");
mainForm.edit.text=totp.ComputeTotp();
mainForm.plus.setBackground(qrencode.bitmap(tostring(qrstr),2,3).copyBitmap(mainForm.plus.width))
mainForm.button.oncommand = function(id,event){
	var t=totp.VerifyTotp(mainForm.edit.text,timeWindowUsed,rfc.RfcSpecifiedNetworkDelay)
	if(t){
		msg.ok("验证成功",0)//因允许一个步长的延迟,则上一个验证码,当前验证码,下一验证码均可验证
	}
	else {
		win.clip.write(totp.ComputeTotp())
		msg.ok("已复制正确的验证码",0)
	}
}
//事件验证hotp
var hotp=kio.otp.Hotp(key);
var counter =0 ; 
var qrHstr=kio.otp.OtpUri(key,"user","isuser",1/*Hotp*/,0/*sha1*/,6,30,counter)
mainForm.edit2.text=hotp.ComputeHOTP(counter);
mainForm.plus2.setBackground(qrencode.bitmap(tostring(qrHstr),2,3).copyBitmap(mainForm.plus2.width))
mainForm.button2.oncommand = function(id,event){
	//counter为关键参数,在谷歌身份验证器中每点击刷新一次,counter加1
	var t=hotp.VerifyHotp(mainForm.edit2.text,counter)
		if(t){
		msg.ok("验证成功,下次验证请使用新的验证码验证",0)
		counter=counter+1;
	}
	else {
		win.clip.write(hotp.ComputeHOTP(counter))
		msg.ok("已复制正确的验证码",0)
	}

}

mainForm.show();
return win.loopMessage();

最新回复 (2)
  • 光庆 1月前
    0 2

  • ccbwx 1月前
    0 3
    赞赞赞
返回
发新帖