私はよくパスフレーズでファイルを暗号化するためにGnuPGを使用します。私は非常に偏執的で、GnuPGで使用される鍵の派生が十分に遅いとは思いません。
このため、パスフレーズをGnuPGに入力する前に、独自の鍵導出を行うことにしました。
Pythonスクリプトがあり、静的ソルトを使用して1000万ラウンドのPBKDF2-SHA512を実行し、結果を16進数でエンコードして出力します。これを「事前導出」と呼びます。
まずパスフレーズで実行し、その出力を中間パスフレーズとしてGnuPGに送ります。
私は正しい方向に進んでいますか、それともこれを行うために時間を無駄にしていますか、それともさらに悪いことに、暗号化セキュリティを弱めていますか?
事実は別として とにかくカスタム暗号コードをデプロイしない方がいい 、あなたは車輪を再発明しています。 OpenPGPのstring-to-key機能は構成可能であり、互換性を失うことなくニーズに合わせて調整できます。ここでは、サイクル数の選択については説明しませんが、少し厳しいように見えます。このトピックについて を読んで、PBKDF2に反復を追加してもセキュリティが強化されないのはどの時点ですか? .
man gpg
から:
--s2k-cipher-algo name
--personal-cipher-preferences
および--cipher-algo
が指定されていない場合は、パスフレーズを使用した対称暗号化の暗号アルゴリズムとしてnameを使用します。デフォルトはAES-128です。
--s2k-digest-algo name
対称暗号化のパスフレーズをマングルするために使用されるダイジェストアルゴリズムとしてnameを使用します。デフォルトはSHA-1です。
--s2k-mode n
対称暗号化のパスフレーズをマングルする方法を選択します。 nが0の場合、単純なパスフレーズ(一般的には推奨されません)が使用され、1はパスフレーズにソルト(使用されるべきではありません)を追加し、3(デフォルト)はプロセス全体を何度も繰り返します(
--s2k-count
を参照してください)。
--s2k-count n
対称暗号化のためにパスフレーズをマングルする回数を指定します。この値の範囲は、1024以上65011712以下です。デフォルトはgpg-agentから問い合わせられます。 1024-65011712の範囲のすべての値が有効であるとは限らないことに注意してください。無効な値が選択された場合、GnuPGは最も近い有効な値に切り上げます。このオプションは、
--s2k-mode
がデフォルトの3に設定されている場合にのみ意味があります。
まとめると、次のオプションは同じ効果があります。
gpg --s2k-mode 3 --s2k-digest-algo SHA512 --s2k-count 10000000 --symmetric
--s2k-mode 3
はGnuPGのデフォルトです(このオプションの妥当な設定のみ)。 --s2k-cipher-algo
は含まれていません。これは、キーの派生には関係がないためです(とにかく、あなたが説明した「事前派生」では処理されません)。または、これをgpg.conf
のデフォルトとして設定できます。
s2k-mode 3
s2k-digest-algo SHA512
s2k-count 10000000
これらのオプションは、メッセージ/ファイルの対称暗号化に使用できるだけでなく、秘密鍵のパスフレーズ保護にも使用できます。
パスフレーズの保護はGPGのセキュリティを維持するための最も重要な部分ですが、既存のセキュリティを強化するのではなく弱める可能性があります。
パスフレーズがコンピュータのメモリにある時間を最小限に抑えることが重要です。 GPGがメモリを適切にゼロにして、露出を最小限に抑えることは確かです。ただし、Python=のようなメモリ管理言語は、実際には安全な文字列操作を容易にしません。つまり、最初のパスフレーズとGPGに渡すパスフレーズは、コンピューターの仮想マシンに残される可能性があります。メモリ(これをディスク上で読み取る)抽出される可能性はどの程度かは議論の余地がありますが、GPGがキーをそのままにしておく時間よりもはるかに大きくなります。
また、SHA512ハッシュをGPGにどのようにフィードするかについても言及していません。それを印刷して、コピーしてGPGに貼り付けたとしても、それはひどいことです。 (秘密のデータにはコピーバッファーを使用しないでください。)
そのため、既存のGPGオプション(@JenEratの answer を参照して優れた概要を参照)を使用し、 独自の暗号をロールバックしないでください を覚えておくことをお勧めします。