如何在自定义非谷歌登录webapp中使用GoogleAuthenticator进行tfa(双因素身份验证)

cod*_*iot 5 oauth google-api google-authentication google-api-client google-authenticator

好吧,我花了2个小时在谷歌上搜索它是什么以及如何在网络应用程序中使用它!但没有成功.

大多数链接都会讨论扫描代码或在GoogleAuthenticar移动应用中输入一些密钥,它会每30秒返回一次更改验证码.

一些事情 :

  1. Web应用程序有自己的登录名.这意味着用户不会使用Google登录到webapp.
  2. 如果攻击者获得了用户的密码,他会将QRcode视为下一步,他可以直接使用手机中的GoogleAuthenticator应用程序进行扫描(据我所知).它是如何仅与用户的手机相关联的?
  3. 在各个网站中,它提到用户和服务器之间的共享秘密,这意味着在注册时,我们向用户提供共享密钥,他可以在她的移动GoogleAuthenticator应用程序中使用,然后在阅读QR代码时使用它?
  4. 在上述情况下,如果用户丢失或遗忘了秘密,该如何处理?使用忘记密码再次将密码发送给用户的电子邮件?

我很困惑,如果它是一个非谷歌非Android应用程序,它怎么能以一种方式实现!

我得到的只是,这只是一个概念,要求我们自己的实现,并在GoogleAuthenticator的源代码中提供一些帮助.请纠正我?

我认为这是解决的办法是,我们必须写我们自己的移动应用,就像提到的这个家伙在这里,但我仍然不知道如何将移动应用与服务器之间的秘密将是独一无二的,每个安装该应用程序,以便它只识别特定用户或有没有办法编写我们自己的应用程序并使用GoogleAuthenticator移动应用程序而无需在我们的webapp中登录Google?

Enr*_*omo 6

Google身份验证器(移动应用程序)实现基于时间的一次性密码算法.在您询问的场景中,双因素身份验证的工作方式如下:

  • 用户生成一次性密码以由服务器应用程序验证.
  • 服务器将使用TOTP算法详述的过程验证密码.

用户设备上的密码生成可以由任何实现已为您的用户帐户"配置"的TOTP的应用程序执行. 这里配置意味着与服务器共享秘密,正如您在问题中提到的那样.

现在,试着回答你的问题:

  1. 您的应用程序使用自己的一组用户凭据或Google的事实对双因素身份验证没有直接影响.无论这些凭据是什么,您都需要一种方法来识别您的用户(用户名),以便能够继续验证其TOTP密码,因为您需要知道该用户是谁.换句话说:使用TOTP和使用谷歌身份验证器应用并不能意味着不必在网站上使用谷歌的凭据.

  2. 我不确定我是否理解正确.每个帐户的Google身份验证器应用程序配置执行一次.如果攻击者坐在你背后并在配置Google身份验证器时拍摄了你的屏幕照片,那么是的,他可以使用您的凭据配置自己的应用程序,读取您正在使用的相同条形码.尽管如此,他还需要您的凭据(正确)才能执行登录,然后提供一次性TOTP密码.无论如何,这是一个安全问题,源于用户不正确地处理自己的凭据,无论您使用何种技术,您都可能遇到类似的问题.为了制作一个不完美的比喻,就像问" 用户是否在桌面上留下代码,攻击者看到它并窃取了它的照片,是否可以使用它们? ".当然,他可以.

  3. 是的,阅读条形码是您可以配置应用程序并在客户端应用程序和服务器之间共享密钥的方法之一.您可以使用其他方法,例如手动将密钥输入应用程序,但使用QR代码更快,更不容易出错.您甚至不需要生成QR代码,因为您可以使用Google的Web API,正如我在您要求我回答此问题时正在阅读的博客文章中所解释的那样.事实上,那里描述的Java服务器端库使用Google Web API并返回一个URL,供用户检出并读取自己的QR.如果您想构建自己的QR逻辑,​​请继续,但如果您有资格使用Google的API(这是您应该检查的内容),则没有令人信服的理由.

  4. 如果秘密丢失,则取决于您自己的政策,如果这是您自己的申请.首先,您应该在用户通知后立即使旧秘密无效.然后,您可以使用您在创建TOTP密码时为用户提供的临时代码来验证自己的身份.如果他也丢失了暂存代码,您可能希望回退到其他一些方式来验证他的身份,例如在他的帐户中使用某种备份信息(备份电话号码,安全问题等).根据您的标准验证用户身份后,您将发布新凭据并从头开始:即使用新的QR和/或新密钥重新配置Google身份验证器.

总结一下:是的,如果您愿意,可以使用Google身份验证器应用程序作为客户端前端:无需再构建另一个应用程序.您应该考虑的唯一事情是Google身份验证器在其TOTP实现中使用30秒窗口:验证TOTP密码的服务器端逻辑将必须使用相同的窗口大小(即IIRC,标准值由TOTP RFC).