web-dev-qa-db-ja.com

Authyの2FAがサーバーに接続しない場合、どのように機能しますか?

私は二要素認証がどのように機能するか知っていると思いました:

  • パスワードを入力します。
  • サーバーは乱数(トークン)を生成し、SMSを介して私に送信します。
  • このトークンを入力します。
  • サーバーは、入力したトークンが以前の2FAリクエストで生成されたトークンと一致することを確認します。

しかし、今日、私は Authy を発見しました。このプログラムの2要素認証(2FA)がどのように機能するのか、私にはわからないようです。

Authyは、サーバーに接続せずに秘密の番号(2FAトークン)を表示します。どうすればいいの?

これらのトークンはランダムではないと思いますか?たぶん、それはある種の数列であり、初期シードパラメータを知ることでこれが決定論的なプロセスになりますか?多分このシーケンスは時間の関数ですか?それはどのように機能しますか?

安全ですか?たとえば、前のトークンの数が[〜#〜] n [〜#〜]わかっている場合、次の2FAトークンを決定できますか?

24
demas

Authyはサーバーに接続せずに秘密の番号を表示します。どうすればそれができますか?

Authyは、さまざまなフレーバーのワンタイムパスコード(OTP)アルゴリズムを使用しています。最も一般的な2つは、HMACベースのOTP(HOTP)とタイムベースのOTP(TOTP)です。 AuthyはTOTPを使用しています。

両方のアルゴリズムは基本的に同じです。一連の次のパスコードを生成するには、シードデータとカウンターが必要です。 HOTP実装は、ユーザーがパスコードを要求/使用するたびにカウンターをインクリメントし、TOTPは所定の時間間隔の後にカウンターをインクリメントします。

Authyの場合、ユーザーがサーバーにパスコードを送信すると、サーバーはユーザーのシードデータを検索し、リクエストのタイムスタンプに基づいてカウンター値を計算してから、適切なパスコードを生成します。次に、サーバーは、生成されたパスコードがユーザーが送信したパスコードと一致することを確認します。

安全ですか?前のN個の番号を知っていれば、次の番号を知ることができますか?

はい、いいえ、それはあなたがサーバーのセキュリティを信頼するかどうかに依存します。

以前のN個のトークンが与えられた場合、攻撃者はまだシードデータを回復できないはずです。ただし、これらのアルゴリズムでは、サーバーがすべてのユーザーのシードデータを格納する必要があります。攻撃者が(SQLインジェクションなどを通じて)データベースを危険にさらすことができる場合、有効なパスコードを生成することができます。これは、RSAとそのSecurIDトークンに起こったことです( http://arstechnica.com/security/2011/06/rsa-finally-comes-clean-securid-is-compromised/

Duo Security( https://www.duosecurity.com/ )やTwitter( https://blog.Twitter.com/2013/login-verification-on-Twitter -for-iphone-and-Android )は、非対称鍵暗号化を使用したチャレンジ/レスポンス2要素認証を実装することで、この問題に取り組んでいます。この場合、公開鍵を保存する必要があるだけです。つまり、データベースが漏洩した場合、攻撃者は有効な応答を生成するために必要な秘密鍵を持っていません。

免責事項、私はデュオで働いていました。


コメントの質問に基づいて更新されました

アルゴリズム(HOTPまたはTOTP)はサーバーとクライアントアプリケーションで同じである必要がありますか?

アルゴリズムは同じですが、カウンター値の生成方法が異なります。 GoogleがHOTPで、AuthyがGoogleアカウントをサポートしたい場合、アプリはTOTPアカウントとは異なるカウンター値を生成して保存する必要があります。

HOTPクライアントは次のパスコードを取得するためにサーバーとの接続を必要としますか(前回からの要求の量がわからないため)、TOTPはそれを必要としませんか?

いいえ、HOTPは機能するために接続を必要としませんが、電話とサーバーが簡単に同期しなくなるため、HOTPは通常使用されません。

サーバーとアプリの両方がカウンター値0で開始するとします。サーバーには通常、有効であると見なされるウィンドウ(おそらく次の10個のパスコード)があります。ユーザーがパスコードを送信すると、サーバーは送信されたパスコードを次の10個の生成されたパスコードと比較します。 10のいずれかが一致した場合、サーバーは格納されたカウンター値を更新して同期を維持できます。

ただし、問題は、ユーザーがパスコードを使用せずにアプリで生成しすぎる可能性があることです。ユーザーがパスコードウィンドウサイズを超えてカウンターをインクリメントできる場合、サーバーはパスコードが有効であることを確認できなくなります。


OTPトークンがどのように生成されるかについて詳しくは、 この情報提供のブログ投稿 を参照してください。

30
JackWink

シンプルなREST APIを使用して通信しているようです。トークンの安全性に関しては-

トークンは、一方向関数(SHA-2)と256ビットのキーを使用して生成されます。攻撃者が何百ものトークンにアクセスできたとしても、新しい有効なトークンを生成することは数学的に不可能です。詳細を知りたい場合、AuthyはRFC4426( http://www.ietf.org/rfc/rfc4226.txt )に基づいています。

つまり、はい、安全な方法を使用してトークンを生成します。

0
Ashley B