谷歌验证码 JS实现

在他人源码上修改,查看源码请点击totp.js

This Script is a Time-based One-time Password Algorithm Wirtten By JavaScript.

谷歌验证码的生成

//const CryptoJS = require('crypto-js/hmac-sha1')
function dec2hex(s) { return (s < 15.5 ? '0' : '') + Math.round(s).toString(16); }
function hex2dec(s) { return parseInt(s, 16); }
function base32tohex(base32) {
    var base32chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ234567";
    var bits = "";
    var hex = "";
    for (var i = 0; i < base32.length; i++) {
        var val = base32chars.indexOf(base32.charAt(i).toUpperCase());
        bits += leftpad(val.toString(2), 5, '0');
    }

    for (var i = 0; i + 4 <= bits.length; i += 4) {
        var chunk = bits.substr(i, 4);
        hex = hex + parseInt(chunk, 2).toString(16);
    }
    return hex;
}

function leftpad(str, len, pad) {
    if (len + 1 >= str.length) {
        str = Array(len + 1 - str.length).join(pad) + str;
    }
    return str;
}
function getCode(secret) {
    var key = base32tohex(secret);

    var epoch = Math.round(new Date().getTime() / 1000.0);
    var time = leftpad(dec2hex(Math.floor(epoch / 30)), 16, '0');
    // var shaObj = new jsSHA("SHA-1", "HEX");
    // shaObj.setHMACKey(key, "HEX");
    // shaObj.update(time);
    // var hmac = shaObj.getHMAC("HEX");
    var hmac = CryptoJS.HmacSHA1(time, key).toString(CryptoJS.enc.Hex);
    var offset = hex2dec(hmac.substring(hmac.length - 1));
    var otp = (hex2dec(hmac.substr(offset * 2, 8)) & hex2dec('7fffffff')) + '';
    otp = (otp).substr(otp.length - 6, 6);
    return otp;
}
//获取谷歌验证码
pm.globals.set("helpGoogleCode", getCode("TCVLFF47LCOHJKPW"));

reference
Article http://blog.tinisles.com/2011/10/google-authenticator-one-time-password-algorithm-in-javascript/
Author: @russau
Code Source at :http://jsfiddle.net/russau/ch8PK/

posted @ 2020-12-07 10:53  那年长安  阅读(371)  评论(0编辑  收藏  举报