3

Google Authenticatorを使用する2要素認証で以下のコードを使用しています。この検証の問題は、ローカル マシンでは Google 認証コードが正しく検証されているが、サーバーでは検証されていないことです。サーバーの時刻設定: (UTC-05:00) 東部標準時 (米国およびカナダ) システムの時刻設定: (UTC-06:00) 中部標準時 (米国およびカナダ)

サーバーでは、検証ボタンを複数回押しようとすると、正しく検証される場合と正しく検証されない場合があります。なぜこれを行うのかわかりません。

誰でもこの問題を整理するためのアイデア/提案を手伝ってくれます

 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;
        }
    }
4

2 に答える 2

0

checkAdjacentIntervals を 5 に設定しようとしましたが、Google 認証コードを検証できましたが、前述のように、私の場合は正しくない過去のコードを検証します。

そのため、NTP を使用して正しく同期することでサーバーの時刻を修正し、期待どおりに動作し始めました。

于 2015-06-30T20:30:49.553 に答える