Vij*_*ati 2 perl google-authenticator two-factor-authentication
我正在寻找一个简单的Perl实现,它验证使用服务器端密码创建的Google身份验证器令牌.例如,
以下Google URL允许您以base32格式(在下面的情况下,秘密是e4ytonjeim4hcsrhja5fe5kqfu)对服务器密码进行编码,作为可以从Google身份验证器应用程序中读取的QR代码(请参见下图):
https://chart.googleapis. COM /图表?CHT = QR&CHS = 100×100&CHL = otpauth%3A%2F%2Ftotp%2Fmysite%3A29%3Fsecret%3De4ytonjeim4hcsrhja5fe5kqfu%26issuer%3Dmysite
将QR码扫描到验证器应用程序后,它会生成令牌,如:716340.如何验证令牌的正确性?
这个问题是这个Python问题的Perl等价物:Python中的 Google Authenticator实现
这是另一种解决方案,您可以验证它是否与此示例中生成的令牌相匹配
use Authen::OATH;
use Convert::Base32;
my $oath = Authen::OATH->new();
my $secret = "JBSWY3DPEHPK3PXP";
my $otp = $oath->totp( decode_base32( $secret ) );
print $otp."\n";
Run Code Online (Sandbox Code Playgroud)
好吧花了一点时间,但我有一个Perl解决方案(希望这弥补了一个稍微懒惰的问题:)感谢Borodin对此的帮助(在Perl中使用六角形字符串的SHA1 HMAC)
#!/usr/bin/perl -w
use strict;
use warnings;
use Convert::Base32;
use Digest::HMAC_SHA1 qw/ hmac_sha1_hex /;
my $base_32_secret = "JBSWY3DPEHPK3PXP";
print "".totp_token($base_32_secret)."\n";
sub totp_token {
my $secret = shift;
my $key = unpack("H*", decode_base32($secret));
my $lpad_time = sprintf("%016x", int(time()/30));
my $hmac = hmac_sha1_hex_string($lpad_time, $key);
my $offset = sprintf("%d", hex(substr($hmac, -1)));
my $part1 = 0 + sprintf("%d", hex(substr($hmac, $offset*2, 8)));
my $part2 = 0 + sprintf("%d", hex("7fffffff"));
my $token = substr("".($part1 & $part2), -6);
return $token;
}
sub hmac_sha1_hex_string {
my ($data, $key) = map pack('H*', $_), @_;
hmac_sha1_hex($data, $key);
}
Run Code Online (Sandbox Code Playgroud)