什么是两步验证?GoogleAuthenticator工作流程及实际上验证方法
什么是两步验证?
您应该熟悉两步验证,对吧?例如,苹果有自己的两步验证政策,防止用户的账户密码被盗和锁定手机进行勒索。这种例子并不少见,所以苹果建议大家开启两步验证。
谷歌的验证器一般也用于登录进行两步验证,和苹果的两步验证一样。只是Google的Authenticator使用越来越广泛,比如GitHub的两步验证就是基于Google的Authenticator。
Google 身份验证器简介
Google Authenticator 是一种基于时间和哈希的一次性密码算法的两步验证软件令牌。用户需要下载绑定网站的手机APP(Authenticator)。当网站验证完成用户名和密码后,将验证APP上生成的6位验证码。验证通过则登录成功google身份验证器,否则登录失败。
谷歌身份验证器使用
让我们看一下 Github 上使用 Google Authenticator 启用两步验证的应用。
如图所示,Github 上默认不开启两步验证。点击设置按钮进行设置。
Github 提供了两种基于 APP(Google Authenticator)和短信验证码的两步验证方式。我们选择第一个 Google Authenticator。
进入第一个验证模式,然后在APP验证器不工作时显示一堆恢复码以备不时之需。保存它们并单击下一步。
这是认证器的钥匙,下载谷歌的AuthenticatorAPP,然后扫描二维码进行绑定。
绑定后,APP Github模块下方会显示一个6位数的验证码,在上面的框中输入即可。
如下图所示,已成功启用两步验证。
接下来google身份验证器,我们退出 Github 并再次登录。该页面将提示您输入 Google 的验证器验证码。如果APP不能正常使用,可以使用底部之前保存的恢复码登录。
好的,Google Authenticator 就到此为止,它是如何工作的,它的原理是什么?我们的网站和APP是如何连接谷歌验证器的,让我们一一揭开谜底。
Google 身份验证器工作流程
其实Google Authenticator使用的是TOTP算法(Time-Based One-Time Password,即基于时间的一次性密码),其核心内容包括以下三点。
1、安全密钥
是客户端与服务端约定的安全密钥,也是绑定手机APP认证器(手机端通过扫描或手动输入安全密钥的方式绑定)和验证客户端唯一需要的密钥。验证码 安全密钥,由加密算法生成,最后经过Base32编码。
2、验证时间
Google 选择了 30 秒作为时间片,T 的值是从 Unix 纪元(1970 年 1 月 1 日 00:00:00) 算起的 30 秒数,所以在 Google Authenticator 中我们可以看到验证码每30秒刷新一次。
更详细的原理参考:
3、签名算法
Google使用HMAC-SHA1算法,全称:Hash-based message authentication code(哈希运算消息验证码),它以一个key和一个消息为输入,生成一个消息摘要作为输出,这里取SHA1 算法作为消息输入。
使用HMAC算法是因为只有用户自己知道正确的输入key,所以会得到唯一的输出。该算法可以简单地表示为:
hmac = SHA1(秘密 + SHA1(秘密 + 输入))
其实TOTP是HMAC-OTP(基于HMAC的一次性密码生成)的超集,不同的是TOTP是以当前时间为输入,而HMAC-OTP是以自增计算器为输入,需要使用同步。
Google 身份验证器的实际应用
了解了以上原理,我们就可以实战了。
/**
* 微信公众号:Java技术栈
*/
public class AuthTest {
@Test
public void genSecretTest() {
String secret = GoogleAuthenticator.generateSecretKey();
String qrcode = GoogleAuthenticator.getQRBarcodeURL("Java技术栈", "javastack.cn", secret);
System.out.println("二维码地址:" + qrcode);
System.out.println("密钥:" + secret);
}
@Test
public void verifyTest() {
String secret = "ZJTAQGLVOZ7ATWH2";
long code = 956235;
GoogleAuthenticator ga = new GoogleAuthenticator();
boolean r = ga.verifCode(secret, code);
System.out.println("是否正确:" + r);
}
}
第一种方法是生成一个密钥和一个绑定到扫描二维码的URL。
第二种方法是根据密钥和验证码进行身份验证。
这里只是GoogleAuthenticator类的源码逻辑参考。
如果你有收获,请点赞转发,也可以留言表达你的问题和意见。
点击链接查看亮点
:
♡
♡
♡
♡
♡
长按下图
版权声明:
作者:中州西鹿谷歌
链接:https://www.gmail777.com/archives/1082
来源:中州西鹿
文章版权归作者所有,未经允许请勿转载。
共有 0 条评论