web-dev-qa-db-ja.com

暗号化された秘密鍵をブルートフォースにできるのはなぜですか?

SSHキーを使用してリモートアクセス用のサーバーを認証する場合、サーバーに対するパスフレーズの推測を確認せずに、認証されているかどうかを確認せずに、暗号化された秘密キーから実際のキーとパスフレーズを考案することが可能なのはなぜですか?

パスフレーズはキーの復号化にのみ使用され、リモートサーバーに送信されないことを理解していますが、正しい復号化の結果と誤った復号化の結果を簡単に区別できる理由がわかりません。それが不可能である(または妥当ではない)場合、SSHキーはブルートフォーシングの影響を受けにくく、したがってより強力になりますか?

私はそれを弱点と見ていますが、公開鍵認証の背後にある数学をほとんど理解していないので、私が見逃した理由があると思いますが、はるかに賢い人々は知っています。

14
Ben Page

RSA秘密鍵で構成されるプレーンテキストは、特定の数学的な特性を満たすため、簡単に認識できます。特に:

d = e^-1 mod (p-1)(q-1)

つまり、公開鍵と候補dを指定すると、

d . e mod (p-1)(q-1)

結果が1、正しいキーが見つかりました。

解決策は、秘密鍵を保護するために強力なパスフレーズを使用することです。

12
caf

さて、それは調査に値するアイデアです。

@cafが示すように、RSA秘密鍵には多くの内部構造があり、簡単に認識できます。間違ったパスワードで暗号化されたRSA鍵を復号化しても、有効なRSA秘密鍵のように見えるようなパスワードベースの暗号化スキームを設計することは非常に困難です。

ただし、これは [〜#〜] dsa [〜#〜] キー(および楕円曲線バリアント [〜#〜] ecdsa [〜# 〜] )。 DSA秘密鍵は、keyパラメーターpと呼ばれます)、qg)は秘密にする必要はありません(これらは対応する公開鍵);鍵の唯一の本当にプライベートな部分は、x、整数モジュロq。任意の整数モジュロqは、有効なDSA秘密鍵です。したがって、xのパスワードベースの暗号化を次のように行うことができます。

  • qを選択して256ビットの数値にします(つまり2255 <q <2256)。
  • 256ビットブロックのブロック暗号を使用します(例: Rijndael -AESは128ビットブロックと128ビット、192ビットまたは256ビットの鍵を持つRijndaelですが、元のRijndaelも256ビットブロックのモード)。
  • xをパスワードで暗号化するには、まずパスワードからキーを導出し(- bcrypt を使用)、次に暗号化x(256ビット文字列として)Rijndaelを使用。結果の文字列が(=と解釈された場合)[0..q-1]の範囲にない場合は、もう一度暗号化します。 、予想される範囲に戻るまで。平均して、Rijndaelを2回未満呼び出す必要があるため、これは計算上難しくありません。
  • xを復号化するには、入力したパスワードからキーを導出し、Rijndael復号化を適用するだけです。ここでも、[0..q-1]の範囲に戻るまで再帰的に実行します。

これは実行可能です。いいアイデアですか?このような暗号化の利点は、暗号化された秘密鍵のコピーを入手した攻撃者がパスワードをブルートフォースすることができなくなることです。一方、攻撃者が公開鍵のコピーも持っている場合は、正しいパスワードで復号化したことを簡単に確認できます。公開鍵は公開することを意図しているため、秘密鍵ほど機密である必要はありません。ターゲットサーバーにそれがあります。実際には、秘密キーを使用してログインするallサーバーには、公開キーのコピーがあります。したがって、公開鍵の機密性は中程度です。したがって、上記の「検証できないパスワード暗号化」によって提供される利点は微妙に見えます。一方、次の欠点があります。ユーザーがパスワードを誤って入力した場合、サーバーは引き続き問い合わせを受け、SSHは「ユーザーがキーボードを操作した」と「サーバーに問題がある」とを区別できなくなります。

ですから、あなたが求めることは少なくともいくつかの主要なタイプでは実現可能ですが、それが(まだ)実装されていないことは理解できます。それは論争のない勝利ではありません。これは、ユーザビリティとセキュリティの間のトレードオフです(少しのセキュリティを得るには、ユーザビリティを少し失うでしょう)。

12
Thomas Pornin

公開鍵は常に秘密鍵から生成できるため、攻撃者が公開鍵を持っている場合(これはもっともらしい、公開されている)、答えを確認することは常に簡単です。これはすべての非対称暗号化アルゴリズムの基本であると思います。

0
kiyo

基本的に、希望どおりのシステムを構築することは不可能です。

攻撃者があなたの公開鍵を持っていると想定する必要があります(公開鍵は公開されており、多くのマシンに保存されています)。秘密鍵の候補が与えられると、攻撃者は公開鍵を使用して、この候補が正しいかどうかをテストできます(たとえば、候補秘密鍵が公開鍵で暗号化されたものを正しく復号化するかどうかを確認することによって)。したがって、攻撃者はパスワードの候補が与えられた場合、対応する秘密鍵の候補を回復し、それを公開鍵と照合することにより、常にその有効性を確認できます。これは、使用される特定の公開鍵アルゴリズムや、秘密鍵の保存と暗号化の形式に固有のものではありません。これは、SSH秘密鍵を保存するためのほとんどすべての想像できる方法に存在する基本的な制限です。

つまり、SSHにこのリスクがあるのは、リスクを回避する現実的な方法がないためです。

したがって、SSH秘密鍵を保護するには、強力なパスフレーズを選択する必要があります。

0
D.W.

「秘密鍵」ファイルには、公開鍵と秘密鍵の両方が格納されています。

ファイルは対称アルゴリズムで暗号化されています。

ファイルが含まれているペンドライブを盗んだ場合、他の暗号化されたファイルをブルートフォースできるのと同じように、パスフレーズをオフラインでブルートフォースできます。ファイルを復号化すると、公開鍵と秘密鍵の両方が手に入ります。

認証に使用されるキーはめったにありません。通常、これらは信頼できる安全なチャネルを確立するために使用されます。その後、ユーザー名/パスワードで自分自身を認証する必要があります。ペンドライブを盗んでキーを復号化しても、サーバーにアクセスすることはできませんが、接続を仲介することができます。

あなたが何を求めていたのか正確にはわかりませんが、これが役に立てば幸いです。

0