googleAuthenticator 谷歌身份验证器,即谷歌动态口令,Google身份验证器Google Authenticator是谷歌推出的基于时间的一次性密码(Time-based One-time Password,简称TOTP),只需要在手机上安装该APP,就可以生成一个随着时间变化的一次性密码,用于帐户验证。
1、时间戳,精确到微秒,除以1000,除以30(动态6位数字每30秒变化一次)
2、对时间戳余数 hmac_sha1 编码
3、然后 base32 encode 标准编码
4、输出大写字符串,即秘钥
func GoogleAuthenticatorCode(string secret)
{
key := base32decode(secret)
message := floor(current Unix time / 30)
hash := HMAC-SHA1(key, message)
offset := last nibble of hash
truncatedHash := hash[offset..offset+3]
// 4 bytes starting at the offset
// Set the first bit of truncatedHash to zero
// remove the most significant bit
code := truncatedHash mod 1000000
// pad code with 0 until length of code is 6
return code
}
1.基于密钥和时间计算一个HMAC-SHA1的hash值,这个hash是160 bit的,
2.将这个hash值随机取连续的4个字节生成32位整数,
3.将整数取31位
4.取模得到一个的整数。
func GoogleAuthenticatorCode(string secret){
key := base32decode(secret)
message := counter encoded on 8 bytes
hash := HMAC-SHA1(key, message)
offset := last nibble of hash
truncatedHash := hash[offset..offset+3]
// 4 bytes starting at the offset
// Set the first bit of truncatedHash to zero
// remove the most significant bit
code := truncatedHash mod 1000000
// pad code with 0 until length of code is 6
return code
}
go get -u https://github.com/crazykun/googleAuth
package main
import (
"fmt"
"github.com/crazykun/googleAuth"
)
func main() {
str := `TESTTESTTESTTEST`
code, _ := googleAuth.GetCode(str)
fmt.Println(code)
}
JumpServer使用ssh脚本实现一键登录, 自动输入google二次验证
go build example/main.go -o googleAuth
#!/bin/sh
code=`./googleAuth TESTTESTTEST`
export LC_CTYPE="en_US.UTF-8"
expect -c "
spawn ssh [email protected] -p22
expect \"*ode]:\"
send \"$code\r\"
expect \"*Opt> \"
send \"1\r\"
expect \"*Host]>\"
send \"server_name\r\"
expect \"*]$\"
interact
"
win版使用xshell软件时, 可使用Xshell-OTP自动登录跳板机
地址:Xshell-OTP