web-dev-qa-db-ja.com

openssl aes-256-cbc出力ファイルでハッシュファイルが常に異なるのはなぜですか?

このコマンドを使用してファイルを暗号化しようとしました:

openssl enc -aes-256-cbc -in $infile -out $outfile -pass file:$keyfile

同じ入力ファイルに対して、出力ファイルのハッシュが異なる理由。

2
cakyus

CBC には IV が必要です:データの最初のブロックはランダムでなければなりません。受信者がメッセージを解読するために必要なものを入手できるように、データとともに送信されます。 CBCのIVは、 均一にランダム および unpredictable である必要があります。 openssl encコマンドは、8個の固定バイトと8個のランダムバイト(16個のランダムバイト)でIVを作成します。同じメッセージを2回暗号化すると、IVが変わります。 (固定IVを使用するオプション-nosaltがありますが、これはセキュリティ上さらに悪く、パスワード自体が1つのメッセージに対してランダムに生成されない限り実行しないでください。)

暗号化のすべての非破損モードにはIVまたは同等の機能があるため、同じメッセージを2回暗号化すると、異なる暗号文が生成されます。これは、少なくとも、攻撃者が2つの暗号化されたメッセージに同じプレーンテキストがあるかどうかを検出できないようにするために必要です。個別のメッセージに対してIVを繰り返すと、他の攻撃が開始される可能性があります。たとえば、CBCを使用すると、IVが再利用された場合、2つのメッセージに共通のプレフィックスが暗号文に表示されます。同じメッセージを2回暗号化すると同じ暗号文につながることがわかった場合、何かが壊れています。

深刻な作業にはopensslコマンドを使用しないでください。これは、ライブラリ関数のショーケースとしてのみ使用するものであり、そのためにも設計が不適切です。これまで見てきたように、encコマンドは、IVが必要なほどランダムではないため、安全に動作しません。最悪の問題は、キーがパスワードから派生する方法です。 openssl encはMD5 の1ラウンドを使用しますが、これは悪いことです。本質的に遅い機能( キーストレッチ機能 )攻撃者がありそうなパスワード(辞書の単語、1337バリエーションなど)を試みるブルートフォースクラッキングの試行を遅くします。

主要なユーザーレベルの暗号化ツールは、 GPGで、Ubuntuでは gnupg または gnupg パッケージ。パスワードでファイルを暗号化するには、次を使用します

gpg -c filename

パスフレーズの入力を求められます。暗号化されたファイルはfilename.gpgに保存されます。復号化するには、gpg filename.gpgを実行してパスフレーズを入力します。

3
Gilles

(質問のコマンドに-d復号化オプションを誤って追加したと思います。)

暗号化されたファイルは、ランダムな64ビット 暗号化ソルト がOpenSSLが生成し、デフォルトで各暗号化ファイルに含めるため、異なります。これは-nosaltオプションで無効にできますが、OpenSSLのman encのドキュメントにあるように、これは一般的に非常に悪い考えです。

OpenSSLおよびSSLeayの以前のバージョンとの互換性が必要な場合を除き、キーがパスワードから派生している場合は、-saltオプションを常に使用する必要があります。

-saltオプションを使用しないと、パスワードに対して効率的な辞書攻撃を実行したり、ストリーム暗号暗号化データを攻撃したりできます。これは、ソルトがないと同じパスワードが常に同じ暗号化キーを生成するためです。 saltが使用されている場合、暗号化されたデータの最初の8バイトはsalt用に予約されています。ファイルを暗号化するときにランダムに生成され、復号化されると暗号化ファイルから読み取られます。

2
Vincent Yu