web-dev-qa-db-ja.com

openssl encはmd5を使用してパスワードとソルトをハッシュします

ウィキペディアは、md5の衝突抵抗は2 ^ 18( https://en.wikipedia.org/wiki/MD5 )であると述べています。

Openssl encがmd5を使用してパスワードとソルトをハッシュしていることがわかりました。 27文字のランダムなパスワード(62文字のアルファベット)を使用したいとします。これにより、62 ^ 27 = 10 ^ 48 = 2 ^ 160の可能なパスワードが生成され、解読に非常に長い時間がかかります。

さて、md5はブルートフォースが不可能であるというこの仮定をどのように変更しますか?衝突を見つけるのが「簡単」なので、適切なハッシュを見つけるのに2 ^ 18回しか試行しませんか?

はいの場合、openssl encがまだmd5を使用しているのはなぜですか?

7
randor

OpenSSLアプリは慎重に使用する必要があります。少なくとも現在の標準では、多くの場合、古くておそらく安全でないデフォルトがあります。

この場合、openssl encはデフォルトでMD5のダイジェストを使用します(apps/enc.c

    if (md && (dgst=EVP_get_digestbyname(md)) == NULL)
            {
            BIO_printf(bio_err,"%s is an unsupported message digest type\n",md);
            goto end;
            }

    if (dgst == NULL)
            {
            dgst = EVP_md5();
            }

-md "メッセージダイジェスト"オプションを使用してこれを明示的に設定できます。サポートされている任意のダイジェスト(sha256など)を使用できます。

openssl enc -md sha256 -e -aes256 -in infile.txt -out outfile.enc -pass pass:foo

一部のアサーションは正しいですが、特に攻撃者がダイジェストの出力を知らないため、衝突攻撃は適用されないため、ここではまったく適用されません。

衝突を見つけることは、時々しか役に立ちません。 MD5出力が署名または整合性チェックとして使用される場合。衝突攻撃では、処理するハッシュ出力が必要です。

この場合、MD5は key-derivation function として使用されています。そのため、通常より興味深いのは プリイメージ耐性 です:ダイジェストを指定すると、それを生成する入力(パスワードなど)を作成できます。 MD5には、良好であるが不完全なプリイメージ耐性があり、意図した128ではなく、約123ビットです。 RFC6151 を参照してください。

暗号化されたファイルのみが与えられた場合、攻撃者のタスクが暗号化されたデータを回復することである場合、暗号化に使用される対称キー(key + IV)を発見する必要があります。このキーは、パスフレーズから計算できるダイジェストでもあり、代わりに発見できます(ソルトが使用されている場合は、ファイルで使用できます)。

攻撃者はパスワードまたはキー(salt/passwordのダイジェスト)を知りませんが、どちらかを実行します。 MD5出力がバイアスされている場合、攻撃者を助けるmightは何ですか?しかし、私が知る限り、そうではありません。

(厳密には、暗号化されたデータにアクセスする必要はなく、何かを証明するためにパスワードを回復するか、暗号化されたデータにアクセスするためにキーを回復するだけの2つのシナリオが考えられます。)

2つの明らかな攻撃は次のとおりです。

  1. (対称暗号)鍵空間全体をブルートフォースします。KDF(ハッシュ/ダイジェスト)出力がバイアスされている場合、これは本来よりも小さくなり、攻撃者を助ける可能性があります。
  2. パスワードスペースを総当たりにします。入力が人間によって選択された場合、これはキースペースよりも小さくなります(saltは事前に計算された攻撃を排除しますが、encはデフォルトでランダムなsaltを使用します)

理想的には、バイアスのない良好なKDF、少なくとも予想される入力エントロピーと同じ大きさの出力、対称暗号鍵サイズに一致し、攻撃#2がショートカットを提供しないように高価であることが望まれます。

MD5のようなダイジェストを短い出力(128ビット出力)でKDFとして使用すると、暗号化の実行に使用される鍵は128ビットのみとなり、この場合、必要なパスフレーズ(〜160ビット、 62 ^ 26)。また、使用する対称暗号鍵のサイズも考慮してください。理想的には、これらを一致させる必要があります。

ここでの最大の問題は 潜在的に問題がある MD5の使用ではなく、openssl encが使用するKDFが「安価」である、具体的には1つのみを使用することですラウンド、パスワードに対するブルートフォース攻撃を最高の攻撃にする(apps/enc.c、行#569):

             EVP_BytesToKey(cipher,dgst,sptr,
                            (unsigned char *)str,
                            strlen(str),1,key,iv);

EVP_BytesToKey (1にハードコード)の6番目のパラメーターは、攻撃者の速度を低下させるように設計された(この場合はそうではない)カウントです。代わりに使用する必要があるものは、堅牢で高価な key-stretching function like bcrypt またはscryptです。

10
mr.spuratic

まあ、パスワードごとに異なるソルトを使用する場合、ソルトの使用方法によって異なります。つまり、ソルトごとにレインボーテーブルを再作成する必要があるため、パスワードごとに2 ^ 18回のパスワード試行を行う必要があります。

レートリミッターや侵入検知もある場合、これはオフサイトのパスワードシステムをクラックする実行可能な方法ではありません。

SSLはサーバー/クライアントの状況で使用されるため、適切に適用されたシステムでは、ブルートフォースによってパスワードを「解読」することはできません。

したがって、保護は、「標準」のRainbowテーブルとIDSを使用できないことから生じます。

それがMD5をまだ使用している理由は、これはレガシーおよび互換性によるものです(すべてのシステムがまだすべての長さでSHA2を使用できるわけではないため、組み込みデバイスを考えてください)。

1
LvB