邢台提供网站建设公司电话,大型旅游网站,做网站ps笔记本电脑,关于做好网站建设的通知转载自 两步验证杀手锏#xff1a;Java 接入 Google 身份验证器实战
什么是两步验证#xff1f;
大家应该对两步验证都熟悉吧#xff1f;如苹果有自带的两步验证策略#xff0c;防止用户账号密码被盗而锁定手机进行敲诈#xff0c;这种例子屡见不鲜#xff0c;所以苹…转载自 两步验证杀手锏Java 接入 Google 身份验证器实战
什么是两步验证
大家应该对两步验证都熟悉吧如苹果有自带的两步验证策略防止用户账号密码被盗而锁定手机进行敲诈这种例子屡见不鲜所以苹果都建议大家开启两步验证的。
Google 的身份验证器一般也是用于登录进行两步验证和苹果的两步验证是同样的道理。只不过 Google 的身份验证器用得更多更广泛如 GitHub 的两步验证都是基于 Google 身份验证器。
Google Authenticator 简介
Google Authenticator 身份验证器是一款基于时间与哈希的一次性密码算法的两步验证软件令牌用户需要下载手机 APPAuthenticator该手机 APP 与网站进行绑定当网站验证完用户名和密码之后会验证此 APP 上对应生成的 6 位验证码数字验证通过则成功登录否则登录失败。
Google Authenticator 使用
我们来看下 Github 上的使用 Google 身份验证器开启两步验证的应用。
如图所示默认 Github 是没有开启两步验证的点击设置按钮进行设置。 Github 提供了基于 APP 谷歌身份验证器和短信验证码两种两步验证的方式我们选择第一种谷歌身份验证器。 进入第一种验证模式接下来展示了一堆的恢复码用来当 APP 验证器不能工作的紧急情况使用。把它们保存起来然后点击下一步。 这个就是身份验证器的关键了下载 Google 的 Authenticator APP然后扫描这个二维码进行绑定。 绑定之后APP Github 模块下面会显示一个 6 位的验证码把它输入到上面那个框里面就行了。 如下图所示已经成功开启两步验证了。 接下来我们退出 Github 再重新登录页面就会提示要输入 Google 的身份验证器验证码了如果 APP 不能正常工作最下方还能通过之前保存下来的恢复码进行登录。 好了Google Authenticator 使用就到这里那它是如何工作的它是什么原理呢我们的网站、APP 如何接入 Google Authenticator接下来我们一一拉开谜底。
Google Authenticator 工作流程
实际上 Google Authenticator 采用的是 TOTP 算法Time-Based One-Time Password即基于时间的一次性密码其核心内容包括以下三点。
1、安全密钥
是客户端和服务端约定的安全密钥也是手机端 APP 身份验证器绑定手机端通过扫描或者手输安全密钥进行绑定和验证码的验证都需要的一个唯一的安全密钥该密钥由加密算法生成并最后由 Base32 编码而成。
2、验证时间
Google 选择了 30 秒作为时间片T的数值为 从Unix epoch1970年1月1日 00:00:00来经历的 30 秒的个数所以在 Google Authenticator 中我们可以看见验证码每个 30 秒就会刷新一次。
更详细原理参考 https://blog.seetee.me/post/2011/google-two-step-verification/ 3、签署算法
Google 使用的是 HMAC-SHA1 算法全称是Hash-based message authentication code(哈希运算消息认证码)它是以一个密钥和一个消息为输入生成一个消息摘要作为输出这里以 SHA1 算法作为消息输入。
使用 HMAC 算法是因为只有用户本身知道正确的输入密钥因此会得到唯一的输出其算法可以简单表示为 hmac SHA1(secret SHA1(secret input)) 事实上TOTP 是 HMAC-OTP基于HMAC的一次密码生成的超集区别是 TOTP 是以当前时间作为输入而HMAC-OTP 则是以自增计算器作为输入该计数器使用时需要进行同步。
Google Authenticator 实战
知道上面的原理我们就可以来应用实战了。
/*** 微信公众号Java技术栈*/
public class AuthTest {Testpublic void genSecretTest() {String secret GoogleAuthenticator.generateSecretKey();String qrcode GoogleAuthenticator.getQRBarcodeURL(Java技术栈, javastack.cn, secret);System.out.println(二维码地址: qrcode);System.out.println(密钥: secret);}Testpublic void verifyTest() {String secret ZJTAQGLVOZ7ATWH2;long code 956235;GoogleAuthenticator ga new GoogleAuthenticator();boolean r ga.verifCode(secret, code);System.out.println(是否正确 r);}
}第一个方法是生成密钥和一个扫描二维码绑定的URL。
第二个方法是根据密钥和验证码进行验证。
这里仅提供一下 GoogleAuthenticator 类的源码逻辑参考。 http://awtqty-zhang.iteye.com/blog/1986275