ウィキペディアは、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を使用しているのはなぜですか?
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つの明らかな攻撃は次のとおりです。
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です。
まあ、パスワードごとに異なるソルトを使用する場合、ソルトの使用方法によって異なります。つまり、ソルトごとにレインボーテーブルを再作成する必要があるため、パスワードごとに2 ^ 18回のパスワード試行を行う必要があります。
レートリミッターや侵入検知もある場合、これはオフサイトのパスワードシステムをクラックする実行可能な方法ではありません。
SSLはサーバー/クライアントの状況で使用されるため、適切に適用されたシステムでは、ブルートフォースによってパスワードを「解読」することはできません。
したがって、保護は、「標準」のRainbowテーブルとIDSを使用できないことから生じます。
それがMD5をまだ使用している理由は、これはレガシーおよび互換性によるものです(すべてのシステムがまだすべての長さでSHA2を使用できるわけではないため、組み込みデバイスを考えてください)。