生成された時間ベースのワンタイムパスワード(TOTP)値にアクセスできる場合、理論的には秘密鍵をデコードできますか?
はいの場合、どのくらいの時間と生成された値がいくつ必要ですか?
ブルートフォースと十分な時間があれば何でも可能です...
情報(非標準トラック) 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ビットキーを使用している場合は、少し時間がかかります...
脚注:(*)一粒の塩で物事をとることについてのトピックでは、パスワードを塩漬けにしてください。美味しくなります。
TOTPはこれに抵抗するように明示的に設計されています。
TOTPは、次のように機能するHMACベースのワンタイムパスワード(HOTP)に基づいています。
両方が同じ鍵を知っており、(理論的には)同じカウンターを維持しているため、常に一緒に認証できます。通常、認証を行う当事者は、カウンターの非同期化にある程度の余裕を与えます。 cからc + 5までのすべての可能なコードを計算して一致するもの。これにより、セキュリティが低下しますが、パーティ間のカウンタの非同期化が可能になります。
TOTPはこのスキームを変更して、cをcに置き換えますt、これは時間ベースの値です。 cの値tはcとして計算されますt =(t-t)/ tバツ、ここでtは現在の時刻(例:Unixエポック秒)、tはトークンが作成された時刻であり、tバツは、30秒などのインターバル時間です。実質的にこれがもたらすのはct30秒ごとに増分する値。両方のパーティのクロックがおおまかに同期されており、ずれていない限り(異なるクロック時間が設定されている可能性がありますが、t各パーティによって個別に設定されるため、これを補正します)これにより、両方のクライアントが同じTOTP出力を同時に生成します。
(数百万のコードが知られている場合でも)与えられた桁を知るだけでこのスキームを破ることは、HMACハッシュアルゴリズム(HMAC-SHA1またはHMAC-SHA256など)に対する完全なキー回復攻撃を必要とするため、実行できません。まだ行われています。適切なHOTPとTOTPの実装では、キーの回復やカウンターの回復から保護されます。
ただし、すべての実装がキー付きPRFとして適切なHMAC関数を使用するわけではありません。無線操作のガレージオープナーなどの一部のHOTP実装では、切り捨て前にハッシュ値を生成するために、独自のPRFまたはCRC32のようなものさえ利用しています。これらは通常、サーチスペースが非常に小さいため、いくつかの値を回復することによって破損する可能性があります。