いるProtobufはchar[]
の代わりString
を使用するための任意のオプションを提供していません。反対に、Protobufメッセージは意図的に完全に変更できないように設計されており、異なる種類のセキュリティを提供します。プログラムの複数のサンドボックスコンポーネント間で単一のメッセージインスタンスを共有することができます。 。セキュリティエンジニアとしての私の個人的な意見で
- 他の人が反対するでしょうが - あなたがリンクするSOの質問に記載されている「セキュリティ」は、いくつかの理由で、実際には、追求する価値セキュリティ劇場ではありません。
攻撃者は、プロセスのメモリを読み取ることができる場合
は、すでに失ってしまいました。シークレットのメモリを破棄する前にそのシークレットのメモリを上書きしても、攻撃者が適切なタイミングでメモリを読み取れば、パスワードを見つけることができます。しかし、悪いことに、攻撃者があなたのプロセスのメモリを読み取ることができる位置にいる場合、一時的なパスワードを抽出するよりも悪いことが起こる可能性が高い:おそらく長寿命の秘密(例えば、サーバーのTLS秘密鍵)メモリの一部を上書きしてアプリケーションの動作を変更したり、アプリがアクセスするすべてのリソースにアクセスしたりします。これは、使用後に特定のフィールドをゼロにすることで意味を満たすことができる問題ではありません。
は現実的に、あなたが制御することはできませんその上、あなたの秘密は、とにかくコピーすることができ、あまりにも多くの方法は、全体の運動議論の余地を作り、そこにある:
- あなたが注意している場合でも、ガベージコレクタが持っている可能性がありメモリを動かしながらその秘密のコピーを作り、目的を破った。これを避けるには、管理されていないメモリにバックアップされた
ByteBuffer
を使用する必要があります。
- プロセスにデータを読み込む場合、この方法でデータを上書きしないライブラリコードをほとんど確実に経由します。たとえば、
InputStream
は内部バッファリングを行い、後でそのバッファをゼロにしない可能性があります。
- オペレーティングシステムは、いつでもディスク上のスペースをスワップするためにデータをページアウトし、後でそのデータをゼロにする必要はありません。したがって、たとえメモリをゼロにしても、それはスワップで持続する可能性があります。 (スワップを暗号化すると、システムがシャットダウンしますが、必ずしも、カーネルの外にスワップ暗号化キーを抽出することができるローカルマシン上に存在し、攻撃者から保護しない場合にこれらの秘密を効果的になくなっていることを保証します。)
- 等
だから、私の意見では、特にこのように秘密を上書きできるようにするには、Javaで変更可能なオブジェクトを使用することは有用な戦略ではありません。これらの脅威は、他の場所で対処する必要があります。
KeePassは、メモリ内のデータを保護するためにWindowのData Protection APIを使用することを重視しています。私はDPAPIが実際に何か良いかどうか分からない(もっと劇場?)。何かご意見は? – bazza
@bazza私は何かが紛失している可能性がありますが、AFAICTは主に、スワップアウトされたメモリに対するオフライン攻撃から保護します。暗号化されたスワップを使用すると同じ効果があります。オンライン攻撃者(同じユーザーアカウントで実行される悪意のあるプロセス)がDPAPI自体を呼び出して復号化できるため、オンライン攻撃はメモリを簡単に復号化できます。 –
ええと、http://keepass.info/help/base/security.htmlをもっと読めば、メモリ内のデータを暗号化/復号化するために使用される鍵を格納するようになっているようです。だから私はあなたが何かを見逃したとは思わない、私はあまりにも多くを私は他の場所で見た小さなビットと作品に読んだ! MonoとWindowsの違いについてのこのページの興味深いコメント。 – bazza