web-dev-qa-db-ja.com

Google認証システムはどのように機能しますか?

Google認証システムは、SMSの2段階認証の代替手段であり、コードが送信されるAndroidにアプリをインストールします。

接続なしで機能します。飛行機モードでも機能します。これは私には得られないものです。接続なしで機能することはどうして可能ですか?その瞬間にどのコードが有効であるかを知るために、携帯電話とサーバーはどのように同期しますか?

227
eez0

Google認証システムは、ワンタイムパスワードを生成するための [〜#〜] hotp [〜#〜] および [〜#〜] totp [〜#〜] アルゴリズムの両方をサポートしています。

HOTPを使用すると、サーバーとクライアントはシークレット値とカウンターを共有します。これらは、両側で個別にワンタイムパスワードを計算するために使用されます。パスワードが生成されて使用されるたびに、カウンターが両側で増分され、サーバーとクライアントの同期を維持できます。

TOTPは基本的にHOTPと同じアルゴリズムを使用しますが、大きな違いが1つあります。 TOTPで使用されるカウンターは、現在の時刻に置き換えられます。システム時刻が同じである限り、クライアントとサーバーは同期したままです。これは Network Time protocol を使用して実行できます。

秘密鍵(およびHOTPの場合はカウンター)は、ある時点でサーバーとクライアントの両方に通信する必要があります。 Google Authenticatorの場合、これはQRCodeエンコードされたURIの形式で行われます。詳細については、 KeyUriFormat を参照してください。

197
user10211

稼働中:

オーセンティケーターは、時間ベースのワンタイムパスワード(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

enter image description here

リファレンス: https://garbagecollected.org/2014/09/14/how-google-authenticator-works/

また、GO実装のこのgithubプロジェクトをチェックしてください: https://github.com/robbiev/two-factor-auth/blob/master/main.go

45
Arjun

それは時間に基づいてシードで機能するため、RSAキーフォブが機能する方法に似ています。つまり、接続も必要ありません。

私は見回しましたが、これはここで答えられます: https://stackoverflow.com/questions/8340495/how-rsa-tokens-works

15
AndyMac

straces _sshdデーモンを1つ使用すると、サーバーがユーザーの構成ファイルを読み取るときに、サーバーがどのように秘密鍵を「知っている」かを確認できます。

#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でスキャンしたか、入力しました。

0
james6125