内容目录
一、authenticator解决了什么问题二、authenticator的原理三、springboot集成authenticator四、做成可复用starter五、参考
一、authenticator解决了什么问题
1.authenticator是什么?
谷歌Authenticator是谷歌推出的一种双因素身份验证应用程序。它是一种为用户提供额外层次的账户保护的安全工具。传统的认证方式通常只依赖于用户名和密码,而双因素身份验证则需要用户提供两个不同类型的验证信息,以增加账户的安全性。
谷歌Authenticator通过生成动态的一次性密码来实现双因素身份验证。当你登录一个已启用谷歌Authenticator的系统或服务时时,需要输入用户名和密码,然后打开 Authenticator 应用来获取当前的一次性密码。这个密码每30秒钟更新一次,只在短暂的时间段内有效。
这种一次性密码是通过基于时间戳的算法计算得出的,同时还需要通过与账户绑定的密钥进行验证。由于每个密码只在极短的时间内有效,并且密码是动态变化的,即使有人获得了您的用户名和密码,他们也无法成功登录您的账户,因为他们没有有效的一次性密码。
谷歌Authenticator还可以与多个账户关联,这意味着您可以在一个应用中管理多个账户的一次性密码。它对于保护您的各种在线账户(如电子邮件、社交媒体、金融服务)非常有用。
简而言之,谷歌Authenticator是一种提供额外层次安全保护的双因素身份验证应用程序。它通过生成动态的一次性密码来增加账户的安全性,并在登录过程中要求用户提供额外的验证信息。
2.它本质上解决了什么问题?
谷歌Authenticator本质上解决了以下问题:
总之,谷歌Authenticator增加了双因素身份验证的安全性,提供了一种简便而有效的方式来保护您的帐户免受未经授权访问和针对性攻击的威胁。
二、authenticator的原理
1.基于时间的TOTP
谷歌Authenticator是基于TOTP算法实现的验证方式,TOTP(Time-based One-Time Password是谷歌Authenticator中使用的一种身份验证方法。它基于时间的动态密码算法,用于生成一次性密码(One-Time Passwords)。
当启用谷歌Authenticator并为特定帐户配置时,它会与该帐户关联一个密钥。该密钥私密地存储在您的设备上。每30秒钟,该密钥都会与当前时间戳进行计算,并生成一个新的一次性密码。
当您需要进行身份验证时,您可以打开谷歌Authenticator应用程序,输入相关帐户的用户名,然后应用程序会基于与服务器同步的时间戳生成相应的一次性密码。您将此密码输入到身份验证页面或应用程序中,以确认您是合法用户。
TOTP 提供了一种额外的安全层次,因为即使有人获得了您的用户名和密码,仍然需要一个有效的一次性密码才能访问您的帐户。这增加了保护您的帐户免受未经授权访问的可能性。
TOTP是HOTP的一个变种,将HOTP中的计数器C替换为依托时间的参数T,T是由当前时间(CurrentUnixTime、初始时间(T0)、步长(X)决定的。即:
TOTP 是谷歌 Authenticator 中使用的基于时间的动态密码算法,提供了一种增强的身份验证机制,以确保只有授权用户能够访问其帐户。
2.认证流程与原理
三、springboot集成authenticator
1.引入依赖
googleauth 是一个开源的 Java 库,用于在 Java 应用程序中实现谷歌 Authenticator 功能。它提供了一组类和方法,让开发人员能够轻松地集成谷歌 Authenticator 的功能到他们的 Java 应用程序中。googleauth 库使用谷歌 Authenticator 的算法来生成一次性密码,并提供了验证这些密码的功能。
2.编写实现
编写生成秘钥、二维码以及code验证工具类:
编写逻辑入口:
3.使用方式
四、做成可复用starter
1.与会话同生命周期
用户登录成功后,需要验证authenticator验证码才能跳转到引导页,也就说明一次性验证码验证态与登录态是强绑定的。
2.做成拦截器
拦截登录接口,把登录路径做成配置化,由starter读取,登录完成后跳转到绑定authenticator或者输入验证码。并且对于其他路径也要同时校验登录态和TOTP验证态。
3.自主控制开启
通过配置控制开启全局authenticator验证能力,包含绑定和code验证。
在用户管理维度,做成可视化能力,可在用户粒度控制是否启用authenticator二次认证
4.可复用
前边我们把接入authenticator二次验证直接写入到了springboot项目中,那么如果有其他项目要接入,还是要从头到尾写一遍,所以我们可以写成springboot-starter的方式,做成可复用的能力。
属性配置:
设置是否启用Authenticator以及登录注册路径。
拦截器:
如果是登录、注册或者验证code路径,preHandle跳过校验,否则检查用户登录态和code验证态。对于postHandle处理完请求返回数据视图之前,如果检查是登录请求,那么返回绑定TOTP验证二维码或者输入code表单。
自动注入配置类:
主要生命相关依赖的bean以及拦截器,拦截器优先级会放到比较低的位置,从而不影响springboot项目本身的拦截器执行顺序。
入口配置:
在starter模块创建meta-INF/spring.factories配置
在依赖该starter的springboot项目启动时会自动加载并解析实例化配置类。
上述步骤是主要的步骤和实现,在具体编码实现时还需要调整和打磨细节问题,完成上述步骤后把starter打成jar,在springboot应用引入并做好相关配置就能使用authenticator能力了。
五、参考
https://github.com/wstrange/GoogleAuth
https://rstyro.github.io/blog/2019/04/29/SpringBoot-Google%E4%BA%8C%E6%AD%A5%E9%AA%8C%E8%AF%81/
https://www.cnblogs.com/50614090/p/5848409.html