ここで私の仮定が間違っている場合は、遠慮なく訂正してください。しかし、私が尋ねている理由を説明させてください。
MSDNから取得SecureString
:
秘密にしておくべきテキストを表します。テキストは使用時にプライバシー保護のために暗号化され、不要になるとコンピューターのメモリから削除されます。
私はそれがでパスワードやその他の個人情報保管するための完全な意味を成し、これを取得SecureString
オーバーをSystem.String
、あなたはどのように制御することができますので、それは実際にメモリに格納されている場合、理由System.String
:
両方が不変であり、不要になった場合、ガベージコレクションをプログラムでスケジュールすることはできません。つまり、インスタンスは作成後は読み取り専用であり、インスタンスがコンピューターのメモリから削除される時期を予測することはできません。したがって、Stringオブジェクトにパスワード、クレジットカード番号、個人データなどの機密情報が含まれている場合、アプリケーションがコンピューターのメモリからデータを削除できないため、使用後に情報が漏洩する可能性があります。
ただし、GUIアプリケーション(たとえば、sshクライアント)の場合、SecureString
はから構築する必要があり System.String
ます。すべてのテキストコントロールは、基礎となるデータ型として文字列を使用します。
つまり、これは、ユーザーがキーを押すたびに、そこにあった古い文字列は破棄され、パスワードマスクを使用していても、テキストボックス内の値を表す新しい文字列が作成されることを意味します。また、これらの値のいずれがメモリから破棄されるか、または破棄されるかどうかを制御することはできません。
次に、サーバーにログインします。何だと思う?認証のために接続を介して文字列を渡す必要があります。それではSecureString
、System.String
...に変換してみましょう。ガベージコレクションを強制的に実行する(またはバッファに0を書き込む)方法がないヒープ上に文字列があります。
私のポイントはある:あなたが何をすべきかに関係なく、線に沿ってどこか、SecureString
されに行くに変換するSystem.String
(ガベージコレクションの任意の保証なし)いくつかの点で、ヒープ上の最低が存在でそれをしますつまり、。
私のポイントではありません:ssh接続への文字列の送信を回避する方法、またはコントロールに文字列を格納させる(カスタムコントロールを作成する)方法を回避する方法があるかどうか。この質問では、「ssh接続」を「ログインフォーム」、「登録フォーム」、「お支払いフォーム」、「食品-あなたがフィード-あなたの子犬-しかし、あなたの子供でないフォーム」に置き換えることができます。等
- それでは、
SecureString
実際に使用することが実際に役立つのはどの時点ですか? System.String
オブジェクトの使用を完全に根絶するために、余分な開発時間を費やす価値はありますか?- 全体のポイントである
SecureString
、単に時間の量削減するSystem.String
ヒープ上では、(物理的なスワップファイルに移動し、そのリスクを低減しますか)? - 攻撃者は、すでにヒープ検査のための手段を持っている場合、その後、彼は最も可能性のいずれか(A)は、既にキーストロークを読むための手段を有している、または(B)、すでに物理的にマシンを持っている ...だからが使用してしまう
SecureString
になってから彼を防ぐためにとにかくデータ? - これは単に「あいまいさによるセキュリティ」ですか。
質問を厚くしすぎていると申し訳ありませんが、好奇心が私をより良くしました。私の質問の一部またはすべてに遠慮なく答えてください(または私の仮定が完全に間違っていることを教えてください)。:)
SecureString
は実際には安全な文字列ではないことに注意してください。これは、誰かがメモリを検査して機密データを正常に取得できる時間枠を短縮する方法にすぎません。これは完全なものではなく、意図されたものではありません。しかし、あなたが提起しているポイントは非常に有効です。関連:stackoverflow.com/questions/14449579/...