今日、私はこれを得ましたwarning一部のパッケージを更新した後、CygwinのOpenSSLによって発行されました、openssl
が含まれていると思います:
***警告:非推奨のキー派生が使用されました。
-iter
または-pbkdf2
を使用することをお勧めします。
Cygwinで使用されるOpenSSLバージョンは:
OpenSSL 1.1.1b 26 Feb 2019
これは、OpenSSLのバージョンが大幅に古いであるLinux Mint 19.1で作成したBluRay上のバックアップを復号化しているときに発生しました。
OpenSSL 1.1.0g 2 Nov 2017
暗号化と復号化に使用するコマンド(最後に-d
を追加する)は次のとおりです。
$ openssl enc -aes-256-cbc -md sha256 -salt -in "${InputFilePath}" -out "${OutputFilePath}"
この警告はどういう意味ですか?今後のバックアップで警告を回避するために何かできるでしょうか?
OpenSSLの2つのメインバージョンと最近のバージョンのSynopsysを比較して、manページを引用させてください。
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]
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]
明らかにいくつかの大きな違いがあります。つまり、この質問を考えると、これらの2つのスイッチが1.1.0にありません。
pbkdf2
iter
現在、基本的に2つのオプションがあります。警告を無視するか、暗号化コマンドを次のように調整してください:
openssl enc -aes-256-cbc -md sha512 -pbkdf2 -iter 100000 -salt -in InputFilePath -out OutputFilePath
これらのスイッチ:
-aes-256-cbc
は、最大限の保護または128ビットバージョンで使用するべきです。3DES(トリプルDES)は、しばらく前に破棄されました。 トリプルDESは2017年にNISTで非推奨になりました 、AESはすべての最新のCPUによって大幅に高速化されています。 CPUに AES-NI命令セット があるかどうかを簡単に確認できます。たとえば、grep aes /proc/cpuinfo
を使用します。 勝利、勝利
-md sha512
SHA-256と比較してSHA-2関数ファミリの高速版です 少し安全かもしれませんが、 勝利、勝利
-pbkdf2
: PBKDF2 (パスワードベースの鍵導出関数2)アルゴリズムを使用
-iter 100000
は、manページを引用して、パスワードのデフォルトの反復回数を上書きしています。
暗号化キーを導出する際に、パスワードに所定の反復回数を使用します。値を大きくすると、結果のファイルを総当たりにするのに必要な時間が長くなります。このオプションでは、PBKDF2アルゴリズムを使用してキーを導出できます。
最近、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
OpenSSLは、少なくとも6年後、enc
コマンドにかなり深刻な欠陥があることを認めたようです(独自のmanページでは「バグ」と呼んでいます)。多分それらは現在修正されていますが、データがまったく重要な場合は、代わりに 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)
したがって、ASCII文字列 "Salted__"のエンコードで始まり、その後にソルト自体が続く、固定16バイトのヘッダーです。これですべてです!暗号化アルゴリズムは示されていません。自分で追跡します。
パスワードとソルトがキーとIVに変換されるプロセスは文書化されていませんが、ソースコードを見ると、カスタムを使用するOpenSSL固有の EVP_BytesToKey() 関数が呼び出されていることがわかります。 鍵導出関数 いくつかの繰り返しハッシュあり。これは非標準で十分に吟味されていない構成(!)であり、疑わしいレピュテーションのMD5ハッシュ関数に依存しています(!!)。この関数は、コマンドラインでndocumented
-md
フラグを使用して変更できます(!!!); 「反復回数」はenc
コマンドによって1に設定され、変更できません(!!!!)。つまり、キーの最初の16バイトはMD5(password || salt)に等しくなり、それだけです。これは非常に弱いです!PCでコードを書く方法を知っている人なら誰でも、そのようなスキームを解読して、数十を「試す」ことができます。毎秒数百万の潜在的なパスワード(GPUで数億が達成可能になります)。 「openssl enc」を使用する場合は、パスワードのエントロピーが非常に高いことを確認してください!(つまり、通常推奨される値よりも高く、少なくとも80ビットを目指します) 。または、できれば使用しないでください。代わりに、より堅牢なものを使用してください( GnuPG 、パスワードの対称暗号化を行う場合、基盤となるハッシュ関数の多くの反復でより強力なKDFを使用します)。
man enc
の場合は、「バグ」の下にもこれがありました。反復カウントを含めることを許可するオプションがあるはずです。
最初の投稿 へのコメントの1つは、これらの問題がほぼ10年前から存在していることについてさえ言及しています...
この反復カウントの問題は本当に面倒です。ほぼ10年前、私は本質的に「openssl enc」と同じことを行いますが、反復PBKDF2ハッシュを使用する「暗号化」Perlスクリプトを作成しました。 ict.griffith.edu.au/anthony/software#encryptソルトされた「openssl enc」ファイルを復号化しますが、代わりにPBKDF2を使用して再暗号化します。 OpenSSLファイルの暗号化は今までに改善されていたはずですが! – anthony 2月7日5:05