web-dev-qa-db-ja.com

パスフレーズで保護された秘密のgpgキーをより安全にするために変更できる具体的なパラメーター

いくつかの questions があり、パスフレーズで保護されたプライベートgpgキーのブルートフォース攻撃に対する耐性について説明しています。この種の議論はいつまでも続くと思われます。

これらの無限の議論をさらに始めるのではなく、gpg.confでどの具体的なオプション/パラメーターを変更して、パスフレーズで保護されたプライベートgpgキーをより安全にすることができるかを尋ねたいと思います。

私が理解していることから、デフォルトのオプションは、最大のセキュリティではなく、主に互換性のために選択されています。たとえば、デフォルトの反復回数s2k-countは65536なので、遅いアームのプロセッサでもミリ秒単位で計算できます。

スローアームプロセッサは気にしません。私はむしろ100ミリ秒長く待機し、パスフレーズを65011712回繰り返します。

私は暗号の専門家ではありません。誰かがデフォルトから変更できる他のオプションを提案できますか?現在、gpg.confには次のものが含まれています。

cipher-algo AES256
s2k-count 65011712

gnupg 1.4.12Debian Wheezyを使用しています

UPDATE(バウンティの場合):

cipher-algos2k-count以外に、パスワードで保護された秘密キーを潜在的な(ブルートフォース)暗号攻撃に対してより耐性にするために変更できるパラメーターは本当にありませんか?

特に、キーのハッシュに使用されるデフォルトのアルゴリズムがSHA1であるという考えは好きではありません。このアルゴリズムは廃止されていませんか?

代わりにs2k-digest-algo SHA256を使用しないでください。または、SHA1(ハッシュサイズ)を使用する十分な理由はありますか?

22
Martin Vegter

S2kの妥当なデフォルト

複数のパラメータを調整できます。 s2k-modeは通常、デフォルト値の3のままにする必要があります。3:これは、ダイジェスト機能の適用中に、saltを使用し、saltとパスフレーズを繰り返します。その他のパラメーターは、対称暗号化アルゴリズム(s2k-cipher-algo)、ダイジェストアルゴリズム(s2k-digest-algo)、および(モード3が使用されている場合)ハッシュとパスフレーズの繰り返し数であり、ハッシュされるデータの量を増やします。 (s2k-count)。これらのオプションはすべて、GnuPG構成ファイル~/.gnupg/gpg.confまたはコマンドライン(接頭辞--、たとえば--s2k-digest-algo)で設定できます。

3つの「調整可能な」オプションでは、実行時間とセキュリティのバランスをとる必要があります。

  • s2k-cipher-algo:暗号化するデータの量は非常に少ないため、注目に値することなく、暗号化に費やされるオーバーヘッドの量は実際には問題になりません差。デフォルトの AES128はおそらく問題ないはずです ですが、特に計算量が大幅に増加しない場合は、追加のセキュリティマージンを使用しないでください。
  • s2k-digest-algoおよびs2k-countは、パスフレーズを解読しようとしたときにハッシュに費やされた時間。デフォルトのSHA-1には既知の弱点がいくつかあり、古くなっていると考えられているため、SHA-2スイートのアルゴリズムを選択してください。この回答を書いている間、65011712の繰り返しとSHA512により、モバイルのCore i7では、各復号化操作にかなりの遅延が生じましたが、1秒をはるかに下回っていました。とにかく、復号化されたキーがgpg-agentにキャッシュされている場合は、おそらく一緒に使用できるものでしょう。

    ここでは妥当なデフォルトについての説明は知りませんが、通常、ハッシュは受け入れ可能な限り高くすることをお勧めします。

スローアームプロセッサは気にしません。私はむしろ100ミリ秒長く待機し、パスフレーズを65011712回繰り返しました。

あなたが本当に気にしなければ、「頑丈な」構成は

s2k-mode 3              # default anyway
s2k-cipher-algo AES256
s2k-digest-algo SHA512
s2k-count 65011712

まだ完全に細かいが、より高速な構成の場合、s2k-countまたはSHA256により小さい値を使用することにより、ハッシュの計算労力を削​​減します。サイファーとしてのAES128は問題ありませんが、顕著な高速計算にはなりません。

これらのデフォルトを秘密鍵暗号化に使用する

TL; DR:ハードディスクからダンプのみをエクスポートするため、キーの保存をトリガーする必要があります(たとえば、パスフレーズを変更することにより)。 GnuPG 2.1(最新)はバグの影響を受けます。

長いバージョン:

OpenPGP/GnuPGでのダイジェストアルゴリズムのいくつかの使用を区別する必要があります。

OpenPGPフィンガープリント

指紋を計算するには、OpenPGPがSHA1を使用してハッシュする必要がある鍵が必要です RFC 4880、セクション12.2、鍵IDと指紋

V4フィンガープリントは、オクテット0x99の160ビットSHA-1ハッシュで、2オクテットのパケット長が続き、その後にバージョンフィールドで始まる公開鍵パケット全体が続きます。

これを構成する選択や可能性はありません。これをさらに下で観察します。

変更検出コードパケット

変更検出コードパケット もSHA-1ハッシュを使用して、暗号化されたメッセージが操作されないように保護します。構成の選択肢はありません。これは今後の議論にはあまり関係がありませんが、完全を期すために述べました。

対称的に暗号化されたセッションキーとデータパッケージ

これらのパッケージは、リテラルデータパッケージを含む公開鍵で暗号化された「通常の」OpenPGPメッセージと、パスフレーズで暗号化されたメッセージの両方で使用されます。

最初のケースでは、RSAのような非対称アルゴリズムを使用して対称鍵が暗号化され、パスフレーズ(またはそのようなハッシュ)は含まれません。

また、パスフレーズを要求してSTDINから暗号化するgpg --symmetricなどを使用して、パスフレーズに基づいてメッセージを対称的に暗号化することもできます。そのようなメッセージのpgpdump( `gpg --list-packetsに似たツールですが、より適切な出力が提供されることもあります)出力は次のようになります。

$ echo "foo" | gpg --passphrase "bar" --symmetric | pgpdump
Old: Symmetric-Key Encrypted Session Key Packet(tag 3)(13 bytes)
    New version(4)
    Sym alg - CAST5(sym 3)
    Iterated and salted string-to-key(s2k 3):
        Hash alg - SHA1(hash 2)
        Salt - 1d cd 72 c8 c3 30 df 84 
        Count - 65536(coded count 96)
New: Symmetrically Encrypted Data Packet(tag 9)(26 bytes)
    Encrypted data [sym alg is specified in sym-key encrypted session key]

string-to-keyプロシージャの設定、ダイジェストアルゴリズム(デフォルトではSHA1)、およびマングルカウントを確認します。これらは、--s2k-digest-algoおよび--s2k-countを使用して構成できます。これらをSHA512と最大値65011712に設定するとどうなるかを見てみましょう。

$ echo "foo" | gpg --passphrase "bar" --s2k-digest-algo SHA512 --s2k-count 65011712 --symmetric | pgpdump
Old: Symmetric-Key Encrypted Session Key Packet(tag 3)(13 bytes)
    New version(4)
    Sym alg - CAST5(sym 3)
    Iterated and salted string-to-key(s2k 3):
        Hash alg - SHA512(hash 10)
        Salt - ea 62 a1 ff 0b 2b f6 6a 
        Count - 65011712(coded count 255)
New: Symmetrically Encrypted Data Packet(tag 9)(26 bytes)
    Encrypted data [sym alg is specified in sym-key encrypted session key]

--s2k-...オプションを使用して、パスフレーズのマングリングオプションを正常に変更しました。

パスフレーズで保護されたエクスポートされた秘密鍵

次に、string-to-keyプロシージャをもう1つ使用して、エクスポートされた秘密鍵を暗号化します。 RFC 4880、5.5.3。秘密鍵パケット形式 は、同じstring-to-keyプロシージャを使用する必要があることを示しますが、--s2k-digest-optionおよび--s2k-countは効果がありません。これ以上:

$ gpg --s2k-digest-algo SHA512 --s2k-count 65011712 --export-secret-subkeys 0xDEADBEEF | pgpdump
[snip]
Old: Secret Subkey Packet(tag 7)(510 bytes)
    Ver 4 - new
    Public key creation time - Mon Jun  1 16:06:06 CEST 2015
    Pub alg - RSA Encrypt or Sign(pub 1)
    RSA n(1024 bits) - ...
    RSA e(17 bits) - ...
    Sym alg - CAST5(sym 3)
    Iterated and salted string-to-key(s2k 3):
        Hash alg - SHA1(hash 2)
        Salt - ab 7d c8 36 6a 67 4d dd 
        Count - 65536(coded count 96)
    IV - e9 76 d3 c4 b0 de 24 3c 
    Encrypted RSA d
    Encrypted RSA p
    Encrypted RSA q
    Encrypted RSA u
    Encrypted SHA1 hash
[snip]

これは実際にしばらくの間かなり戸惑いました。

ただし、解決策はかなり簡単でした。gpg --exportは、secring.gpgからキーをそのままエクスポートするだけです。 gpg --edit-keyのオプションを(パラメーターまたはgpg.confファイルを介して)設定し、続いてpasswdを使用してパスフレーズを変更すると、暗号化されたキーがsecring.gpgに再度書き込まれる-とvoilà 、キーは希望どおりに暗号化されているため、エクスポート中に--s2k-...オプションを設定する必要はありません。

$ gpg --export-secret-subkeys 0xDEADBEEF | pgpdump
[snip]
Old: Secret Subkey Packet(tag 7)(510 bytes)
    Ver 4 - new
    Public key creation time - Mon Jun  1 16:06:06 CEST 2015
    Pub alg - RSA Encrypt or Sign(pub 1)
    RSA n(1024 bits) - ...
    RSA e(17 bits) - ...
    Sym alg - CAST5(sym 3)
    Iterated and salted string-to-key(s2k 3):
        Hash alg - SHA512(hash 10)
        Salt - e1 82 c3 9f 07 74 7f 0c 
        Count - 65011712(coded count 255)
    IV - 97 20 69 ae 8d ec 0d 3c 
    Encrypted RSA d
    Encrypted RSA p
    Encrypted RSA q
    Encrypted RSA u
    Encrypted SHA1 hash
[snip]

GnuPG 2.1(モダン)

2015-06-01以降、GnuPG 2.1(「モダン」ブランチ)はバグの影響を受けます( GnuPG Issue#18 ):ここでは、gpg-agentがこれらすべての操作を処理します。 --s2k-...オプションはまったく気にしません。このバグは、GnuPGのメイン開発者であるWerner Kochによってすでに緊急としてマークされているため、すぐに解決されるはずです。

11
Jens Erat

GnuPG構成パラメーターは既に十分に強力です。 SHA-1の弱点に関しては、実際には、思っているほど重要ではありません。 GnuPGマニュアル から:

SHA-1アルゴリズムも弱点の兆候を示していますが、衝突を作成することは依然として非常に難しく、時間がかかります。プレイメージ攻撃を仕掛けることはまだ遠くにありません。したがって、GnuPGの標準的な使用では、SHA-1に基づく署名は依然として問題ありません。将来の開発に備えて、GnuPGは前進しており、一部のデフォルトはSHA-1よりもSHA-256を優先するように変更されています。数年後にインストールされた最新のGnuPGバージョンのコードベースが十分に大きければ、SHA-1を廃止する準備ができています。

おそらくこれがあなたが探している正確な答えではないかもしれませんが、GnuPGインストールを強化したい場合は、秘密鍵を暗号化されたディスクに保存することをお勧めします。特に強力なパスフレーズを選択することをお勧めします秘密鍵(およびGnuPGパスフレーズとは異なる秘密鍵ファイルコンテナー)。強力なパスワードの基本的なルールは次のとおりです。

  1. 小文字と大文字、数字、記号で構成
  2. ランダムに見える、つまり可能な場合は常に予測可能なパターンを示さない
  3. 長いほど良い
  4. あなたの心にだけ保存

ランダムに見えるパスフレーズは覚えにくいため、ポイント2と4の間の妥協点を見つける必要があります。

2
dr_

誰かがあなたの暗号化されたキーを盗むことができるなら、彼らはあなたのプライベートファイルを読むことができます:彼らはあなたのマシンにコードを実行し、あなたのキーパスワードを盗聴する可能性があります(ただし、強力です)。

GnuPGスマートカード 外部キーパッドを使用すると、カードとパスワードの両方を保護できます。

編集:GPGにパッチを適用して、s2k-countの値を大きくすることもできます。

1
Enos D'Andrea

〜/ .gnupg/gpg.confに偏執狂的なオプションを設定できます。私のものを確認してください。 gpgに強力なAESアルゴリズムを使用するように強制し、パスワードをキーとして使用する前に20000000回ハッシュして、残忍な力による攻撃をはるかに困難にします。

 s2k-cipher-algo AES256 
 s2k-digest-algo SHA256 
 cipher-algo AES256 
 digest-algo SHA256 
 s2k-count 20000000 
 s2k-mode 3 
 force-mdc 
0
smrt28