OpenSSL 1.1.1b警告:OpenSSL 1.1.0gで暗号化されたファイルを復号化するときは、-iterまたは-pbkdf2を使用することをお勧めします。

OpenSSL 1.1.1b警告:OpenSSL 1.1.0gで暗号化されたファイルを復号化するときは、-iterまたは-pbkdf2を使用することをお勧めします。

今日これを受けました。警告するCygwinのOpenSSLは、次のようないくつかのパッケージを更新した後にリリースされましたopenssl

***警告:廃止予定のキー派生を使用してください。またはを
使用する方が良いです。-iter-pbkdf2


これCygwinで使用されるOpenSSLのバージョン以前は:

OpenSSL 1.1.1b  26 Feb 2019

BluRayによって作成されたバックアップの復号化中にこれが発生しました。Linux Mint 19.1ここで、OpenSSLバージョンは明らかに古い:

OpenSSL 1.1.0g  2 Nov 2017

暗号化と復号化コマンド(-d最後に追加するだけ)は次のとおりです。

openssl enc -aes-256-cbc -md sha256 -salt -in "$InputFilePath" -out "$OutputFilePath"

この警告はどういう意味ですか?将来のバックアップでこの問題を回避するためにできることはありますか?

答え1

OpenSSLの2つのメジャーバージョンとSynopsysの最新バージョンを比較するために、マニュアルページを引用します。

OpenSSL1.1.0

openssl enc -ciphername [-help] [-ciphers] [-in filename] [-out filename] [-pass arg] [-e] [-d] [-a/-base64] [-A] [-k password] [-kfile filename] [-K key] [-iv IV] [-S salt] [-salt] [-nosalt] [-z] [-md digest] [-p] [-P] [-bufsize number] [-nopad] [-debug] [-none] [-engine id]

OpenSSL1.1.1

openssl enc -cipher [-help] [-ciphers] [-in filename] [-out filename] [-pass arg] [-e] [-d] [-a] [-base64] [-A] [-k password] [-kfile filename] [-K key] [-iv IV] [-S salt] [-salt] [-nosalt] [-z] [-md digest] [-iter count] [-pbkdf2] [-p] [-P] [-bufsize number] [-nopad] [-debug] [-none] [-rand file...] [-writerand file] [-engine id]

明らかに大きな違いがあります。これはこの質問を念頭に置いて、1.1.0には2つのスイッチがないことです。

  • pbkdf2

  • iter


これで、基本的に2つのオプションがあります。警告を無視するか、暗号化コマンドを次のように調整します。

openssl enc -aes-256-cbc -md sha512 -pbkdf2 -iter 1000000 -salt -in InputFilePath -out OutputFilePath

このスイッチの位置:

  • -aes-256-cbcあなたしなければならない最大保護または128ビットバージョンについては、3DES(Triple DES)がしばらく使用されていないを参照してください。Triple DESは2017年にNISTによって廃止されました。、AESはすべての最新CPUによって大幅に加速されますが、CPUAES-NI命令セット例えばgrep aes /proc/cpuinfo;勝利、勝利

  • -md sha512 SHA-256と比較して、SHA-2機能ファミリーは高速です。より安全かもしれませんが。勝利、勝利ただし、これは新しいバージョンでは変更される可能性があります。SHA命令セット最新のCPUでは

  • -pbkdf2:使用PBKDF2(パスワードベースの鍵導出機能2)アルゴリズム

  • -iter 1000000マニュアルページを引用して、パスワードのデフォルトの繰り返し回数(10000)を上書きします。

    暗号化キーを派生するときは、パスワードに指定された繰り返し回数を使用します。値が高いほど、生成されたファイルを無差別に代入するのに必要な時間が長くなります。このオプションを使用すると、PBKDF2アルゴリズムを使用してキーを派生できます。


繰り返しのデフォルト値は文書化されていませんが、apps/enc.c次のようにファイルに割り当てられます。

case OPT_PBKDF2:
    pbkdf2 = 1;
    if (iter == 0)
        iter = 10000;
    break;

-d復号化するには、元のコマンドラインの最後にスイッチを追加するだけです。

答え2

最近、最新バージョンのcygwinをインストールしました。 「openssl」が警告を出し始めます。

*** WARNING : deprecated key derivation used.
Using -iter or -pbkdf2 would be better.

これで、暗号化に次のようになります。

openssl aes-256-cbc -salt -pbkdf2 -in name -out name.aes

復号化のために、次のことを行います。

openssl aes-256-cbc -d -salt -pbkdf2 -in name.aes -out name

答え3

OpenSSLは少なくとも6年後に最終的にこのコマンドにかなり深刻な欠陥があることを認めたようですenc(自体のマニュアルページではこれを「バグ」と呼びます)。たぶん今は修正しているかもしれませんが、データが重要すぎる場合は、次の(比較的)より安全なツールを使用するのはどうでしょうか?GnuPG代わりに?必ずしも公開鍵暗号化を使用する必要はありません。 gpgは、伝統的な(パスワード/キーファイルのみ)暗号化も実行できます。

これはから抜粋したものです。私の他の答え基本的な強調:

OpenSSLしなければならないgpgが実行するのと同じことをすべて行うことができます(OpenSSLは1998年から存在しましたが、バージョン番号が意味する場合は2010年にバージョン1に達しました)。しかし、間違いを犯しやすく、セキュリティが大幅に低下します。そしてからsecurity.stackexchange.comに関するこの記事(2013年1月から)そして別のレピュテーションが287Kのユーザーの場合、このopenssl encコマンドにはいくつかの欠点がある可能性があります。

OpenSSLで使用される暗号化形式は非標準です。これは「OpenSSLが実行する作業」であり、すべてのOpenSSLバージョンが互いに一貫性を維持したい場合は、OpenSSLソースコードに加えて、この形式を説明する参照文書はまだありません。ヘッダー形式は非常に簡単です。

magic value (8 bytes): the bytes 53 61 6c 74 65 64 5f 5f
salt value (8 bytes)

したがって、固定された16バイトのヘッダーは、「Salted__」文字列のASCIIエンコーディングで始まり、その後にソルト自体が続きます。それだけです!暗号化アルゴリズムは言及されていない。これを直接追跡する必要があります。

パスワードとソルトをキーとIVに変換するプロセスは文書化されていませんが、ソースコードを見るとOpenSSLのみを呼び出すように見えます。EVP_BytesToKey()カスタマイズを使用する関数キー導出関数いくつかの重複したハッシュ。これは、疑わしい評判(!!)のMD5ハッシュ関数に依存する非標準および十分に検証されていない構成(!)です。この関数はコマンドラインから変更できます。文書化されていない -mdフラグ(!!!); 「繰り返し回数」はコマンドencによって設定されます。1そして変更できません(!!!)。これは、キーの最初の16バイトが次のようになることを意味します。MD5(パスワード||塩)、それだ。

これは本当に弱すぎる!PCでコードを書く方法を知っている人なら誰でもこのシステムを解読し、毎秒数千万の潜在的なパスワードを「試みる」ことができます(GPUを使用すると数億のパスワードが可能)。"openssl enc"を使用している場合は、パスワードのエントロピーが非常に高いことを確認してください!(つまり、一般的に推奨されるよりも高く、少なくとも80ビットを目指しています。)またはまったく使用しない方が良いです。代わりに、より強力なものを探してください(GnuPG、パスワードを対称的に暗号化するときは、より強力なKDFと基本的なハッシュ関数の複数の反復を使用します。

man enc「BUGS」の下にもこんなことがあります:

繰り返し回数を含めることを許可するオプションが必要です。

コメントの1つ最初の記事さらに、この問題がほぼ10年間続いたとも言われています。

この反復計算の問題は本当に面倒な問題です。ほぼ10年前、私は「openssl enc」と基本的に同じことを行いますが、繰り返しPBKDF2ハッシュを使用する「暗号化」Perlスクリプトを作成しました。 ict.griffith.edu.au/anthony/software#encrypt これにより、ソルト処理された「openssl enc」ファイルのパスワードが復号化されますが、PBKDF2を使用して再暗号化されます。これでOpenSSLファイルの暗号化が改善されたらと思います! –アンソニー2月7日5時05分

これはgpgを使用した対称暗号化の例
簡単に言うと:

gpg --symmetric --cipher-algo AES256 --output file.gpg file.txt

そして

gpg --decrypt --output file.txt file.gpg

関連情報