如何启用 Google 两阶段验证密码 与 问题解决
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何启用 Google 两阶段验证密码 与 问题解决相关的知识,希望对你有一定的参考价值。
参考技术A 启用是上个月的事情, 已经不太记得, 基本上依照页面指示照著作就会完成了, 在此指纪录几个还记得的项目.登入 Gmail, 点选照片, 选择 Account.
找到 两步骤验证 -> 点选 开启
再来就是填 电话... 等等的一些资料, 在来的登入都会经由手机简讯, 另外填写即时简讯密码. (原始密码 + 简讯密码)
相关新闻: Google开放两阶段验证功能给所有用户, 下述摘录自此篇:
用户可以在「Google帐户」的「个人设定」中启用该功能,整个设定过程大约需要15分钟。使用者必须设定两个电话号码。
第一个电话可以使用上述行动装备或者是普通的手机、室内电话,用来产生或接收上述时效限制密码。第二个电话则是在用户第一个电话号码遗失或无法使用使备用,因此Google建议使用家人或好友的电话号码。
Google 两阶段密码验证 新增 Client 程式
Google 两阶段密码验证的重点, 主要有下述几点:
登入网页 (Gmail)
第一次登入需要搭配手机简讯, 如果有安装 App, 会搭配 Google Authenticator 动态数字密码, 然後可以纪录 30天(此台电脑, 30天内不用重新输入动态数字密码)
http://support.google.com/a/bin/answer.py?hl=en&answer=1037451
注1: 若其他台电脑要登入, 会需要密码 + 动态数字密码, 可以决定当下搭配此数字密码, 或者存 30天, 避免只有依靠一组密码, 增加安全性.
注2: 30天後, 还是会需要重新输入 密码 + 动态数字密码
注3: 请在设定应用程式後,输入所产生的验证码,然後按一下 [验证]。
手机安装 Google Authenticator (智慧型手机: android、iPhone 等)
安装这套在登入时, 如果需要存取动态密码, 开启应用程式就可以看到, 如果没有安装, 就每次都得要等简讯通知, 等不到简讯就无法登入了. XD
安装说明可见官方网页: 安装 Google Authenticator
iPhone Market 搜寻: Google Authenticator
Android Google play 搜寻: Google Authenticator
注: 即使不在手机服务涵盖范围,仍可使用应用程式取得验证码。
应用程式 (Client) 登入存取 Google 服务
启用步骤: Account -> 两步骤验证 - 开启 - 编辑 (点选 "编辑") -> Manage application-specific passwords (电脑或者 Client 服务, 一开始会很常需要到这个页面)
若有新增新的应用程式, 都会需要到此页面 Manage application-specific passwords 产生新的密码, 密码都很长, 而且给这一次使用, 同样密码拿去其他还要再次设定, 就无法设定了.
注1: 所有的应用程式都需要授权, 原始密码是没有用得.
注2: 手机的应用程式也是需要这种授权, iPhone 行事历的作法比较特别, 於下述另外纪录.
两阶段验证登入遇到的 问题 与 解法
当 启用 Google 两阶段验证後, iPhone 的 行事历就无法更新了, 解决方法如下述步骤:
两段认证 於 iPhone 行事历, 可以采用 CalDAV 的方式解决更新问题.
iPhone ical 设定 - CalDAV 日历同步功能
第一栏位输入: google.com
第二栏位输入: Email 帐号ex: example@gmail.com
认证的密码: [密码] 栏位中,输入您的「Google 帐户」或「Google 应用服务」密码
描述栏位输入: Google iCal
相关网页
Android 手机无法登入的问题, 可见此篇: Google 两阶段验证心得与问题
Google 两阶段验证 官方说明 运作方式
两因素 Google 身份验证与服务器上的代码不匹配 - ASP.Net MVC
【中文标题】两因素 Google 身份验证与服务器上的代码不匹配 - ASP.Net MVC【英文标题】:Two Factor Google Authentication not matching the codes on the server- ASP.Net MVC 【发布时间】:2015-09-13 16:51:20 【问题描述】:我在使用谷歌身份验证器的两因素身份验证中使用以下代码。 此验证的问题在于,谷歌身份验证器代码在我的本地机器上正确验证,而不是在服务器上。 服务器时间设置为:(UTC-05:00) 东部时间(美国和加拿大) 我的系统时间设置是:(UTC-06:00) Central Time (US & Canada)
在服务器上 - 当我尝试多次点击验证按钮时,它有时会正确验证有时不会。我不确定它为什么这样做。
任何人都可以帮助我提出解决此问题的想法/建议
public static class TimeBasedOneTimePassword
public static readonly DateTime UNIX_EPOCH = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);
private static MemoryCache _cache;
static TimeBasedOneTimePassword()
_cache = new MemoryCache("TimeBasedOneTimePassword");
public static string GetPassword(string secret)
return GetPassword(secret, GetCurrentCounter());
public static string GetPassword(string secret, DateTime epoch, int timeStep)
long counter = GetCurrentCounter(DateTime.UtcNow, epoch, timeStep);
return GetPassword(secret, counter);
public static string GetPassword(string secret, DateTime now, DateTime epoch, int timeStep, int digits)
long counter = GetCurrentCounter(now, epoch, timeStep);
return GetPassword(secret, counter, digits);
private static string GetPassword(string secret, long counter, int digits = 6)
return HashedOneTimePassword.GeneratePassword(secret, counter, digits);
private static long GetCurrentCounter()
return GetCurrentCounter(DateTime.UtcNow, UNIX_EPOCH, 30);
public static long GetCurrentRemaining()
return (long)(DateTime.UtcNow - UNIX_EPOCH).TotalSeconds % 30;
private static long GetCurrentCounter(DateTime now, DateTime epoch, int timeStep)
return (long)(now - epoch).TotalSeconds / timeStep;
public static bool IsValid(string secret, string password, int checkAdjacentIntervals = 1)
if (password == GetPassword(secret))
return true;
for (int i = 1; i <= checkAdjacentIntervals; i++)
if (password == GetPassword(secret, GetCurrentCounter() + i))
return true;
if (password == GetPassword(secret, GetCurrentCounter() - i))
return true;
return false;
【问题讨论】:
我删除了我之前的评论,即从不检查基础GetPassword(secret)
我现在看到它在 for 循环之前,我之前错过了 :) 你尝试过更高的检查相邻间隔吗?跨度>
我确实尝试为 checkAdjacentIntervals 设置 10,但是当我这样做时,它甚至成功验证了过去的代码,这意味着代码每 30 秒不断变化,因此过去 30 秒的代码也得到成功验证.我不确定这是否是正确的做法,因为它是一个两因素身份验证,我们只是出于安全目的进行额外验证。
确实如此,但我认为这是 checkAdjacentIntervals 的目的 - 考虑客户端和服务器之间的小时间差异。您可能可以将其缩小到 10 以下,但 1 可能还不够。这种双因素身份验证方法(不检查相邻间隔)将要求客户端和服务器都对时间有相同的理解......始终......在 30 秒的误差范围内。这似乎很难实现。
谢谢@Kritner。我听说 NTP 可以用来同步时间。你知道如何在服务器上使用它吗?
【参考方案1】:
我知道这是一个老问题,但它可能会帮助像我这样来寻找答案的其他人。 Google 身份验证基于时间工作。 API 将根据时间验证过去最近生成的代码(标记它,它是时间,而不是时区)。因此,如果系统的实际时间与生成代码的设备不同步,就会出现问题。特别是当系统时间落后于设备时间时。如果您想验证我的答案,请尝试输入一些较旧的代码(基于系统和设备之间的联系差距)。当您的系统领先于设备时,checkAdjacentIntervals 会为您提供帮助,但当它落后时则不会。
【讨论】:
【参考方案2】:我确实尝试将 checkAdjacentIntervals 设置为 5,我能够验证 google 身份验证器代码,但如前所述,它验证了过去的代码,这在我的情况下是不正确的。
所以我们通过使用 NTP 正确同步服务器的时间来更正服务器的时间,然后它开始按预期工作。
【讨论】:
以上是关于如何启用 Google 两阶段验证密码 与 问题解决的主要内容,如果未能解决你的问题,请参考以下文章