大多数链接都会讨论扫描代码或在GoogleAuthenticar移动应用中输入一些密钥,它会每30秒返回一次更改验证码。
少数事情:
我很困惑,如果它是一个非google非Android应用程序,它怎么能以一种方式实现呢!
我得到的只是,这只是一个概念,在GoogleAuthenticator的源代码的帮助下,要求我们自己的实现。请纠正我?
我认为解决方案是,我们必须编写自己的移动应用程序,就像这个提到here的人一样,虽然我仍然不确定移动应用程序和服务器在每次安装该应用程序时都是唯一的,这样它只能识别特定用户,或者有没有办法编写我们自己的应用程序并使用GoogleAuthenticator移动应用程序而无需在我们的网络应用程序中登录Google?
答案 0 :(得分:6)
Google身份验证器(移动应用程序)实施基于时间的一次性密码算法。在您询问的场景中,双因素身份验证的工作方式如下:
用户设备上的密码生成可以由任何实施TOTP的应用程序执行,该TOTP已被配置"为您的用户帐户。 已配置此处意味着与服务器共享秘密,正如您在问题中提到的那样。
现在,试着回答你的问题:
您的应用使用自己的一组用户凭据或Google的事实对双因素身份验证没有直接影响。无论这些凭据是什么,您都需要一种方法来识别您的用户(用户名),以便能够继续验证其TOTP密码,因为您需要知道谁用户是。换句话说:使用TOTP并使用Google身份验证器应用不意味着必须在您的网站上使用Google凭据。
我不确定我是否理解正确。每个帐户的Google身份验证器应用程序配置仅执行一次。如果攻击者坐在你背后并在配置Google身份验证器时拍摄了你的屏幕照片,那么是的,他能够使用您的凭据配置自己的应用程序,读取您正在使用的相同条形码。然而,他还需要您的凭据(正确)才能执行登录,然后提供一次性TOTP密码。无论如何,这是一个安全问题,源于用户不正确地处理自己的凭据,无论您使用何种技术,您都可能遇到类似的问题。要做一个不完美的比喻,就像问" 如果用户离开带有桌面代码的针卡,攻击者看到它并窃取它的照片,是否可以使用它们? &#34 ;.当然,他可以。
是的,阅读条形码是您可以配置应用程序并在客户端应用程序和服务器之间共享密钥的方法之一。您可以使用其他方法,例如手动将密钥输入应用程序,但使用QR代码更快,更不容易出错。您甚至不需要生成QR代码,因为您可以使用Google的Web API,正如我在您要求我回答此问题时所阅读的the blog post中所述。事实上,那里描述的Java服务器端库使用Google Web API并返回一个URL,供用户检出并读取自己的QR。如果您想构建自己的QR逻辑,请继续,但如果您有资格使用Google的API(这是您应该检查的内容),那么您应该这样做没有令人信服的理由。
如果秘密丢失,则取决于您自己的政策,如果它是您自己的申请。首先,您应该在用户通知后立即使旧密码无效。然后,您可以使用在创建TOTP密码时为用户提供的临时代码来验证自己的身份。如果他也丢失了暂存代码,您可能希望回退到其他一些方式来验证他的身份,例如在他的帐户中使用某种备份信息(备份电话号码,安全问题等)。根据您的标准验证用户身份后,您将发出新凭据并从头开始:即使用新的QR和/或新密钥重新配置Google身份验证器。
总结:是的,如果您愿意,可以使用Google身份验证器应用程序作为客户端前端:无需再构建另一个应用程序。您应该考虑的唯一事情是Google身份验证器在其TOTP实现中使用30秒窗口:验证TOTP密码的服务器端逻辑将必须使用相同的窗口大小(即IIRC,标准值由TOTP RFC)。