`
awtqty_zhang
  • 浏览: 91373 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

Google账户两步验证的工作原理【转】

 
阅读更多

      最近在考虑一些用户登录验证的问题,现阶段在涉及到一些交易时,基本上都使用的是短信验证码验证,但有朋友说,有些时候短信验证码会出现延时,不及时。于是就看了一下Google Authenticator(coogle账户两步验证)技术。如下是从一位网友那里转来的该技术的原理描述,做个标记,方便查找。

来源:http://blog.seetee.me/archives/73.html

 

我们往往会在不同的网站上使用相同的密码,这样一旦一个网站账户的密码泄露,就会危及到其他使用相同密码的账户的安全,这也是最近的密码泄露事件造成如此大影响的原因。为了解决这个问题,一些网站在登录时要求除了输入账户密码之外,还需要输入另一个一次性密码。银行常用的动态口令卡就是这种一次性密码的例子,在线支付网站的一次性短信密码则是另一种实现。

Google现在也推荐用户启用两步验证(Two-step verification)功能(Youtube上的视频介绍),并且除了以短信或者电话的方式发送一次性密码之外,还提供了另一种基于时间的一次性密码(Time-based One-time Password,简称TOTP),只需要在手机上安装密码生成应用程序,就可以生成一个随着时间变化的一次性密码,用于帐户验证,而且这个应用程序不需要连接网络即可工作。仔细看了看这个方案的实现原理,发现挺有意思的。下面简单介绍一下。

Google的两步验证算法源自另一种名为HMAC-Based One-Time Password的算法,简称HOTP。HOTP的工作原理如下:

客户端和服务器事先协商好一个密钥K,用于一次性密码的生成过程,此密钥不被任何第三方所知道。此外,客户端和服务器各有一个计数器C,并且事先将计数值同步。

进行验证时,客户端对密钥和计数器的组合(K,C)使用HMAC(Hash-based Message Authentication Code)算法计算一次性密码,公式如下:

HOTP(K,C) = Truncate(HMAC-SHA-1(K,C))

上面采用了HMAC-SHA-1,当然也可以使用HMAC-MD5等。HMAC算法得出的值位数比较多,不方便用户输入,因此需要截断(Truncate)成为一组不太长十进制数(例如6位)。计算完成之后客户端计数器C计数值加1。用户将这一组十进制数输入并且提交之后,服务器端同样的计算,并且与用户提交的数值比较,如果相同,则验证通过,服务器端将计数值C增加1。如果不相同,则验证失败。

这里的一个比较有趣的问题是,如果验证失败或者客户端不小心多进行了一次生成密码操作,那么服务器和客户端之间的计数器C将不再同步,因此需要有一个重新同步(Resynchronization)的机制。这里不作具体介绍,详情可以参看RFC 4226。

介绍完了HOTP,Time-based One-time Password(TOTP)也就容易理解了。TOTP将HOTP中的计数器C用当前时间T来替代,于是就得到了随着时间变化的一次性密码。非常有趣吧!

虽然原理很简单,但是用时间来替代计数器会有一些特殊的问题,这些问题也很有意思,我们选取几个进行一下探讨。

首先,时间T的值怎么选取?因为时间每时每刻都在变化,如果选择一个变化太快的T(例如从某一时间点开始的秒数),那么用户来不及输入密码。如果选择一个变化太慢的T(例如从某一时间点开始的小时数),那么第三方攻击者就有充足的时间去尝试所有可能的一次性密码(试想6位数字的一次性密码仅仅有10^6种组合),降低了密码的安全性。除此之外,变化太慢的T还会导致另一个问题。如果用户需要在短时间内两次登录账户,由于密码是一次性的不可重用,用户必须等到下一个一次性密码被生成时才能登录,这意味着最多需要等待59分59秒!这显然不可接受。综合以上考虑,Google选择了30秒作为时间片,T的数值为从Unix epoch(1970年1月1日 00:00:00)来经历的30秒的个数。

第二个问题是,由于网络延时,用户输入延迟等因素,可能当服务器端接收到一次性密码时,T的数值已经改变,这样就会导致服务器计算的一次性密码值与用户输入的不同,验证失败。解决这个问题个一个方法是,服务器计算当前时间片以及前面的n个时间片内的一次性密码值,只要其中有一个与用户输入的密码相同,则验证通过。当然,n不能太大,否则会降低安全性。

事实上,这个方法还有一个另外的功能。我们知道如果客户端和服务器的时钟有偏差,会造成与上面类似的问题,也就是客户端生成的密码和服务端生成的密码不一致。但是,如果服务器通过计算前n个时间片的密码并且成功验证之后,服务器就知道了客户端的时钟偏差。因此,下一次验证时,服务器就可以直接将偏差考虑在内进行计算,而不需要进行n次计算。

以上就是Google两步验证的工作原理,推荐大家使用,这确实是保护帐户安全的利器。

参考资料

  1. TOTP: Time-based One-time Password Algorithm, RFC Draft, http://tools.ietf.org/id/draft-mraihi-totp-timebased-06.html
  2. HOTP: An HMAC-Based One-Time Password Algorithm, RFC 4226, http://tools.ietf.org/html/rfc4226
  3. Google Authenticator project, http://code.google.com/p/google-authenticator/
分享到:
评论

相关推荐

    Google两步验证安装、取消与更换手机的方法.docx

    1. 访问 Google 账户设置下的使用两步验证页面。 2. 使用用户名、密码和验证码登录,点击关闭两步验证。 3. 系统会显示一个弹出式窗口,以确定用户要关闭两步验证,点击确定即可关闭“两步验证”。 更换手机的方法...

    google身份验证.zip

    两步验证的工作原理是这样的:首先,用户在账户设置中启用两步验证,然后将设备(通常是手机)与该账户关联。当用户尝试从新的设备或不熟悉的网络环境登录时,系统会要求输入一个动态验证码。这个验证码由Google身份...

    后台两步验证插件forTypecho

    【标题】"后台两步验证插件forTypecho"是一个专为Typecho博客系统设计的安全增强型插件,旨在提高用户账户的安全性。在当前网络安全环境下,简单的密码已不足以保护用户的个人信息,两步验证(2FA)成为了一种有效的...

    Springboot 整合谷歌身份验证器实现两步认证,包含前端vue

    在本文中,我们将深入探讨如何将Spring Boot框架与谷歌身份验证器(Google Authenticator)集成,以实现两步验证(2FA)。两步验证是一种安全措施,它要求用户提供两种不同形式的身份验证信息,通常是一次性的密码,...

    PHP谷歌验证器生成秘钥和验证

    谷歌验证器是谷歌公司推出的一款动态口令工具,解决大家的google账户遭到恶意攻击的问题。开启谷歌验证器的登陆两步验证(即Google Authenticator服务)后用户登陆时需要输入额外由手机客户端生成的动态密码。这样,...

    php接入谷歌验证器类

    在PHP中接入谷歌验证器类主要是为了实现两步验证或者多因素身份验证(MFA)。谷歌验证器是一种广泛使用的安全工具,它为用户提供了一种额外的安全层,防止未经授权的访问。这种验证方式通常用于增强用户账户的安全性...

    google账户管理 4.0.4-299849

    4. 两步验证:支持Google的两步验证机制,为用户提供额外的安全保护层,防止未经授权的访问。 5. 数据同步:帮助用户同步Google账户中的数据,如联系人、日历事件、设置等,确保跨设备一致性。 6. 安全更新:定期...

    com-google-android-apps-authenticator2.5.7z

    这款应用广泛应用于个人和企业的网络安全,特别是对于那些需要高度保护的Google账户和其他支持两步验证的服务。 **两步验证 (Two-Factor Authentication, 2FA)**: 两步验证是一种安全措施,要求用户提供两个独立的...

    神秘的Google两步验证-调试中

    首先,让我们深入了解一下两步验证的工作原理。当用户尝试登录时,系统不仅会要求输入常规的用户名和密码,还会请求第二个验证因素。对于Google,这个第二步通常是通过短信或Google Authenticator应用发送的一次性...

    两步验证2

    两步验证(Two-Step Verification,2SV)是一种安全措施,用于增强用户账户的安全性。在传统的密码登录之外,它要求用户提供第二个身份验证因素,通常是一个时间敏感的一次性密码或者通过手机应用、短信或电话接收到...

    20211117233110.zip

    谷歌身份验证器是一款由谷歌开发的两步验证工具,它为用户提供了一种额外的安全层,以保护其在线账户免受恶意攻击。这款工具的主要功能是生成一次性密码,这些密码与用户的常规登录密码结合使用,增加了账户的安全性...

    Desktop_php实现google验证码_

    Google Authenticator是一款广受欢迎的两步验证工具,它为用户提供了一种增强的安全验证方式。在PHP环境中实现Google验证码,可以增加网站的安全性,保护用户数据不被非法获取。下面我们将详细探讨如何使用PHP实现...

    google-authenticator-android-master.zip

    谷歌身份验证器(Google Authenticator)是一款广泛应用于两步验证的安全工具,其源码对于理解和开发类似的移动安全应用具有极高的参考价值。本文将深入探讨这款应用在安卓平台上的实现原理、核心功能及其实现方式。...

    22-03-23-036_Nop_4.40.4(GoogleAuthenticator插件项与启动项的相互组合)

    在当今网络安全日益重要的背景下,两步验证成为增强用户账户安全的重要手段。NopCommerce,作为一款基于.NET Core的开源电子商务平台,也提供了对Google Authenticator插件的支持,以实现更高级别的账户安全保护。...

    Laravel开发-google2fa 谷歌双向认证

    然而,为了进一步增强安全性,开发者常常会集成额外的身份验证方法,如谷歌的两步验证(Google 2-Step Verification,简称Google 2FA)。本篇文章将深入探讨在Laravel开发中如何集成并实现Google 2FA,以及其背后的...

    android_assets:XML两步验证屏幕示例

    两步验证(2-Step Verification)是一种增强的安全机制,它要求用户在登录时除了提供密码之外,还需要通过另一个验证步骤,如短信验证码、指纹识别或谷歌身份验证器生成的动态口令。这种方法显著提高了账户安全性,...

    Laravel开发-google2fa-laravel

    总结来说,`google2fa-laravel` 包为 Laravel 应用提供了方便的集成,让开发者能够轻松地引入强大的两步验证机制,从而增强用户账户的安全性。遵循上述步骤,你就可以在你的 Laravel 项目中实施 Google 2FA 了。同时...

    googlemarket下载应用.pdf

    如果启用了Google账户的两步验证,需要为APK Downloader创建一个单独的应用程序密码。 8. **运营商选择**:在APK Downloader中选择正确的运营商是下载过程的一部分,这有助于确定应用的兼容性,因为某些应用可能只...

    PyPI 官网下载 | django-two-factor-auth-0.4.0.tar.gz

    **两步验证的原理** 两步验证的核心理念是,即使攻击者获取了用户的密码,也无法直接登录,因为他们还需要第二步的验证信息。通常,这第二步可能包括以下一种或多种: 1. **短信验证码**:系统向用户注册的手机号...

    Google Authenticator v5.10.apk 安卓官方原版

    Google Authenticator就是这样一款应用,它为用户提供了一种强大而便捷的两步验证服务,确保了用户在访问个人账户时的额外安全层。本文将深入探讨Google Authenticator v5.10安卓版的特点、功能以及如何使用。 ...

Global site tag (gtag.js) - Google Analytics