如何启用 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 两阶段验证密码 与 问题解决的主要内容,如果未能解决你的问题,请参考以下文章

如何使用GoogleAuthenticator

.Net Core 中的两因素身份验证 - 如何验证令牌

重置密码且未配置两因素设备时如何获得两因素身份验证

如何为 Google Chrome 启用自动登录用户身份验证

u盘加密怎么设置

Google Data Studio:如何使用 2 KEYS 为 API 连接器启用身份验证