Google認証システムは2段階認証プロセスのSMSの代替手段であり、コードが送信されるAndroidにアプリをインストールします。
機能します接続なし。機内モードでも動作します。これは私が得られないものです。接続なしで動作する可能性はありますか?携帯電話とサーバーはどのように同期して、その時点で有効なコードを認識しますか?
コメント
- コードは"送信されません"。シードとカウンターを介して作成されます。
回答
Google認証システムは両方の HOTPをサポートしていますおよび TOTP アルゴリズムによるワンタイムパスワードの生成。
HOTPを使用すると、サーバーとクライアントは秘密の値とカウンター。ワンタイムパスワードを両側で独立して計算するために使用されます。パスワードが生成されて使用されるたびに、カウンターは両側でインクリメントされ、サーバーとクライアントの同期を維持できます。
TOTP基本的にHOTPと同じアルゴリズムを使用しますが、大きな違いが1つあります。TOTPで使用されるカウンターは現在の時刻に置き換えられます。クライアントとシステム時間が同じである限り、サーバーは同期を維持します。これは、ネットワークタイムプロトコルを使用して実行できます。
秘密鍵(およびHOTPの場合はカウンター)にはある時点でサーバーとクライアントの両方に通信されます。 Google Authenticatorの場合、これはQRCodeでエンコードされたURIの形式で行われます。詳細については、 KeyUriFormat を参照してください。
コメント
- の場合HOTP、Google認証システムは、サーバーと同期せずに"が"パスワードを使用したことをどのようにして知るのですか? Google Authenticatorが行うことは、さまざまなキーをフラッシュし続け、モバイルにフィードバックを与えることなく、どれでも使用できることです。
- @MarioAwadその答えはHOTPRFCのセクション7.4にあります。 。 ietf.org/rfc/rfc4226.txt
- 明確に定義された回答とフォローアップをありがとうございます。セクション7.4の簡単な要約:時々カウンターの再同期とカウンターの先読みウィンドウは、インスタント同期を必要とせずに物事を機能させるものです。
- @TerryChiaが指摘したように、秘密鍵QRコードにあります。 QRCode /情報の機密性に注意してください。しばらく前にブログ投稿を書きました netknights.it/en/the-problem-with-the-google-authenticator
回答
作業中:
オーセンティケーターは、時間ベースのワンタイムパスワード(TOTP)アルゴリズムを実装します。次の要素があります。
•共有シークレット(バイトのシーケンス)
•現在の時刻から派生した入力
•署名関数
共有シークレット:共有シークレットは、携帯電話でアカウントを設定するために取得する必要があるものです。 。携帯電話を使用してQRコードの写真を撮るか、手動でシークレットを入力できます。
入力(現在時刻):入力時間の値は携帯電話から取得するだけで、シークレットを取得した後はサーバーとのやり取りは不要です。ただし、携帯電話の時刻がサーバーとして正確であることが重要です。基本的に、サーバーが認識している現在の時刻を使用して、電話で発生することを繰り返します。
署名関数:使用される署名関数はHMAC-SHA1です。 HMACはハッシュベースのメッセージ認証コードの略で、安全な一方向ハッシュ関数(この場合はSHA1)を使用して値に署名するアルゴリズムです。 HMACを使用すると、信頼性を検証できます。シークレットを知っている人だけが、同じ入力(現在の時刻)に対して同じ出力を生成できます。
OTPアルゴリズム:
擬似コード:
original_secret = xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx secret = BASE32_DECODE(TO_UPPERCASE(REMOVE_SPACES(original_secret))) input = CURRENT_UNIX_TIME() / 30 // sets a constant value for 30 seconds hmac = SHA1(secret + SHA1(secret + input)) //apply hashing offset = hmac[len(hmac)-1] & 0x0F //Last nibble four_bytes = hmac[offset : offset+4] //takes a subset of 4 bytes from 20 bytes large_integer = INT(four_bytes) //Covert four bytes to integer small_integer = large_integer % 1,000,00 //gives 6 digit code
参照: https://garbagecollected.org/2014/09/14/how-google-authenticator-works/
GO実装については、次のgithubプロジェクトも確認してください: https://github.com/robbiev/two-factor-auth/blob/master/main.go
コメント
- ' Google認証システムはHOTPもサポートしていませんか?
回答
時間に基づいてシードを処理するため、 RSAキーフォブは機能します。つまり、接続も必要ありません。
見回したところ、次のように回答されています: https://stackoverflow.com/questions/8340495/how-rsa-tokens-works
回答
strace
の場合sshd
デーモン、サーバーがユーザー構成ファイルを読み取るときに、サーバーが秘密鍵をどのように「認識」しているかを確認できます。
#strace -f -v -e open /usr/sbin/sshd -p 2222 -dddd -f /etc/ssh/sshd_config 2>&1 | grep -i goog > > [pid 2105] open("/home/myuser/.google_authenticator", O_RDONLY) = 4 > > [pid 2105] open("/home/myuser/.google_authenticator~", > > O_WRONLY|O_CREAT|O_EXCL|O_TRUNC|O_NOFOLLOW, 0400debug3: > > mm_sshpam_respond: pam_respond returned 1 [preauth]
携帯電話 すでに知っています。QRでスキャンするか、入力しました。
コメント
- これは、トークンが次のようになっていることを示す良い例です。 サーバーに送信されませんが、'実際にはどのように機能するかを説明していません(OPが尋ねたものです)
- 'それ自体ですが、接続性の欠如に対処します。