web-dev-qa-db-ja.com

時間ベースのワンタイムパスワード(TOTP)キーは、生成された値からデコードできますか?

生成された時間ベースのワンタイムパスワード(TOTP)値にアクセスできる場合、理論的には秘密鍵をデコードできますか?

はいの場合、どのくらいの時間と生成された値がいくつ必要ですか?

2
Majal

ブルートフォースと十分な時間があれば何でも可能です...

情報(非標準トラック) RFC 6238 で説明されているように、RFCが作成された時点での時間ベースのワンタイムパスワード(TOTP)アルゴリズムは、SHA-1として一般的に使用されています。 HMACのベース。 TOTPの基本部分を形成するHMACベースのワンタイムパスワード(HOTP)アルゴリズム( RFC 4226 (情報))は、共有シークレットの長さが少なくとも120ビットであるべきであり、160を推奨することを示していますそのキーのビット。

これにより、常に変化するメッセージ(現在のタイムステップ、通常は1970年1月1日から経過した30秒の期間)と組み合わせると、実質的に160ビットの疑似乱数が得られます。これらの160ビットは、少なくとも120ビットのエントロピーソースを持つキーに由来します。

現代のコンシューマーデスクトップコンピューターでは、 最近のベンチマーク は、SHA-1を1,000,000のレートで使用して、約600ミリ秒かかる小さなメッセージをキー+時間のサイズでハッシュすることができました。 (塩分を含んだベンチマークを使用してください(*)。ベンチマークを含めて、明確な答えを出そうとせずに、計算のナプキンの裏側の図を取得します。)

つまり、0.6秒ごとに、任意の時間ブロックでRainbowテーブルに100万個の値を追加できます。 120ビットのキーが与えられた場合、30秒の時間ブロック1つに対して完全なレインボーテーブルを作成するには、7.9 * 10 ^ 30秒(25千千千年)しかかかりません。

しかし、ねえ、私たちは実際にリアルタイムでアカウントにアクセスしようとしているわけではありませんそうですか?宇宙には、国家レベルのアクターのすべてのリソースがあり、常に存在しています。関係するすべてのRainbowテーブルがすでに存在していると仮定することができます。ここでは、この時間では、宇宙の熱死をはるかに超えて泡立っています。

各ワンタイムパスワードは、160ビット値のうち1,000,000桁の10進数です。比較するたびに、潜在的なキーの99.9999%を削除しています。 1.4 * 10 ^ 48の可能なキーを使用すると、キーを理解するのに8または9サイクルしかかかりません。 TOTPキーを破るのに必要なのはわずか200千千千年紀?悪くない!

もちろん、SHA-2、または推奨の160ビットキーを使用している場合は、少し時間がかかります...

脚注:(*)一粒の塩で物事をとることについてのトピックでは、パスワードを塩漬けにしてください。美味しくなります。

2
Ghedipunk

TOTPはこれに抵抗するように明示的に設計されています。

TOTPは、次のように機能するHMACベースのワンタイムパスワード(HOTP)に基づいています。

  • 2つのパーティは、ランダムに生成されたキーkを共有します。これは一般に「共有シークレット」と呼ばれます。このキーは秘密にしておく必要があります。
  • 両当事者は、認証が実行されるたびに増分されるカウンター値cを維持します。
  • 認証は、計算により実行されますHMAC(c、k)where[〜#〜] hmac [〜#〜] はHMAC-SHA256などの一部の [〜#〜] hmac [〜#〜] 関数です。次に、結果のハッシュ値が処理されていくつかのビットが抽出されます。これは、認証コードを生成するために、いくつかの10進数に変換できます。この抽出と変換は、この文脈では一般に「切り捨て」と呼ばれます。
  • 認証が必要な当事者(ユーザーなど)は、同じハッシュ値を計算して切り捨てを行い、提供された数字と比較する相手(サーバーなど)に数字を送信します。それらが一致する場合、ユーザーは認証されます。

両方が同じ鍵を知っており、(理論的には)同じカウンターを維持しているため、常に一緒に認証できます。通常、認証を行う当事者は、カウンターの非同期化にある程度の余裕を与えます。 cからc + 5までのすべての可能なコードを計算して一致するもの。これにより、セキュリティが低下しますが、パーティ間のカウンタの非同期化が可能になります。

TOTPはこのスキームを変更して、ccに置き換えますt、これは時間ベースの値です。 cの値tcとして計算されますt =(t-t)/ tバツ、ここでtは現在の時刻(例:Unixエポック秒)、tはトークンが作成された時刻であり、tバツは、30秒などのインターバル時間です。実質的にこれがもたらすのはct30秒ごとに増分する値。両方のパーティのクロックがおおまかに同期されており、ずれていない限り(異なるクロック時間が設定されている可能性がありますが、t各パーティによって個別に設定されるため、これを補正します)これにより、両方のクライアントが同じTOTP出力を同時に生成します。

(数百万のコードが知られている場合でも)与えられた桁を知るだけでこのスキームを破ることは、HMACハッシュアルゴリズム(HMAC-SHA1またはHMAC-SHA256など)に対する完全なキー回復攻撃を必要とするため、実行できません。まだ行われています。適切なHOTPとTOTPの実装では、キーの回復やカウンターの回復から保護されます。

ただし、すべての実装がキー付きPRFとして適切なHMAC関数を使用するわけではありません。無線操作のガレージオープナーなどの一部のHOTP実装では、切り捨て前にハッシュ値を生成するために、独自のPRFまたはCRC32のようなものさえ利用しています。これらは通常、サーチスペースが非常に小さいため、いくつかの値を回復することによって破損する可能性があります。

5
Polynomial