两步验证杀手锏:Java 接入 Google 身份验证器实战
两步验证
大家应该对两步验证都熟悉吧?如苹果有自带的两步验证策略,防止用户账号密码被盗而锁定手机进行敲诈,这种例子屡见不鲜,所以苹果都建议大家开启两步验证的。
Google 的身份验证器一般也是用于登录进行两步验证,和苹果的两步验证是同样的道理。只不过 Google 的身份验证器用得更多更广泛,如 GitHub 的两步验证都是基于 Google 身份验证器。
Google Authenticator 简介
Google Authenticator 身份验证器是一款基于时间与哈希的一次性密码算法的两步验证软件令牌,用户需要下载手机 APP(Authenticator),该手机 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 epoch(1970年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 {
@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 类的源码逻辑参考。
如果有收获欢迎点赞转发,也可以留言发表你的疑问和看法。
教程:史上最强 Spring Boot & Cloud 教程汇总
两步验证杀手锏:Java 接入 Google 身份验证器实战的更多相关文章
- Java使用google身份验证器实现动态口令验证
参考: 1)https://www.jb51.net/article/121243.htm 2)https://www.cnblogs.com/wuaili/p/9810661.html
- 使用google身份验证器实现动态口令验证
最近有用户反应我们现有的短信+邮件验证,不安全及短信条数限制和邮件收验证码比较慢的问题,希望我们 也能做一个类似银行动态口令的验证方式.经过对可行性的分析及慎重考虑,可以实现一个这样的功能. 怎么实现 ...
- 通过Google身份验证器加强Linux帐户安全
下载Google的身份验证模块: # wget https://google-authenticator.googlecode.com/files/libpam-google-authenticato ...
- linux上使用google身份验证器(简版)
系统:centos6.6 下载google身份验证包google-authenticator-master(其实只是一个.zip文件,在windwos下解压,然后传进linux) #cd /data/ ...
- centos7系统配置系统用户基于ssh的google身份验证
最近也是服务器各种被入侵,所以在安全上,要万分注意,特此记录,借助google的身份验证插件,获取动态验证码完成ssh登陆. OS: centos7 安装配置: 1. 安装epel源 yum -y i ...
- 采用集成的Windows验证和使用Sql Server身份验证进行数据库的登录
采用集成的Windows验证和使用Sql Server身份验证进行数据库的登录 1.集成的Windows身份验证语法范例 1 string constr = "server=.;databa ...
- google 身份验证器
谷歌身份验证器原理 就是服务器与客户端算法相同
- [转载]SQL Server 2008 R2安装时选择的是windows身份验证,未选择混合身份验证的解决办法
安装过程中,SQL Server 数据库引擎设置为 Windows 身份验证模式或 SQL Server 和 Windows 身份验证模式.本文介绍如何在安装后更改安全模式. 如果在安装过程中选择&q ...
- windows身份验证模式和SQL server身份验证模式 有什么不同
两个验证方式是有明显不同的. 主要集中在信任连接和非信任连接. windows 身份验证相对于混合模式更加安全,使用本连接模式时候,sql不判断sa密码,而仅根据用户的windows权限来进行身份验证 ...
随机推荐
- 使用fiddler模拟session失效的测试方法
1.Fiddler的基本界面 2.json串放入本地txt文件中 例如, test.txt: {"retCode": "200","Msg" ...
- 第二阶段第四次spring会议
昨天我将对软件添加了初始页面. 今天我将对软件加上显示时间. try { SkinListBoxItem rt = new SkinListBoxItem(InputForm("请输入&qu ...
- flink 读取kafka 数据,partition分配
每个并发有个编号,只会读取kafka partition % 总并发数 == 编号 的分区 如: 6 分区, 4个并发 分区: p0 p1 p2 p3 p4 p5 并发: 0 1 2 3 ...
- 使用mybatis plus 操作数据库
mybatis plus 是基于mybatis 的一个增强包,比 mybatis 更加容易使用. 特点: 1.分页支持 2.支持自定义查询. 3.简单的情况下,不需要写map.xml 文件 4.支持租 ...
- elasticsearch 修改磁盘比例限制
命令为:下面也可以单独进行限制,官网说可以设置具体数值,但是无没成功,有成功的大神可以在下面告诉我一下哈 PUT _cluster/settings{ "persistent": ...
- IO流的种类
字节流:InputStream(new FileInputStream(new File()); Outpustream(new FileOutputStream(new File()); 字符流: ...
- c语言构建哈希表
/*哈希查找 *哈希函数的构造方法常用的有5种.分别是: *数字分析法 *平方取中法 *分段叠加 *伪随机数 *除留取余法 *这里面除留取余法比较常用 *避免哈希冲突常用的方法有4种: *开放定址法( ...
- RabbitMq相关
RabbitMq 通过通过IP,Port等参数创建connection对象,然后实际上通信用的是channel,channel的建立基于connection RPC 调用: RPCClient通过ch ...
- noip第26课资料
- Postman SMTP 存在跨站脚本(XSS)漏洞,请换用Post SMTP Mailer/Email Log
Postman SMTP 是一个安装量超过10W的WordPress插件,但是已经2年多没有更新,2017年6月29日,被发现存在跨站脚本(XSS)漏洞(查看详情),并且作者一直没有更新,所以被从Wo ...