46

私の理解が正しければ、これはプレーン テキストをメモリから除外するためのものであり、アプリはメモリ、ガベージ ヒープ、またはディスクにページングされたメモリに対する難解な攻撃から保護されます。SecureString にはアンマネージド バイトが供給され、一度に 1 つのアンマネージド バイトが消費されます。その後、文字列はメモリから消去されます。(私が離れていたら私を訂正してください!)

ASP.NET では、シークレットは Web フォームで収集され、HTTPS でポストバックされます。しかしその後、Request オブジェクトはフォームからのすべての要求値を名前と値のペアに変換し、それらをコレクション (Request["TxtPassword"] など) に入れます。そのため、文字列を取得する前であっても、メモリに安全に書き込まれていません。さらに悪いことに、コントロールを使用していた場合、セキュリティで保護されていない表現では、TextBox のプロパティにより多くのマネージド文字列が含まれます。

この SecureString を使用して何かを行うには、管理されていない文字列を受け取る API が必要です。そのため、格納された proc パラメータなどにセキュア文字列を使用することはできないようです。

私はこれを間違っていますか、それとも SecureString を使用して、保護されていない文字列のコピーをマネージド メモリにリークしないようにするのはばかげたことですか?

OAuth または Windows 認証への切り替えはオプションではありません。

4

5 に答える 5

29

正しく推測したように、そして他の人がすでに述べたように、ASP.NETフォームからのセキュリティ機密データを格納するためにSecureStringを使用することはほとんど意味がありません。なぜなら、そのデータはプレーンテキストでメモリにすでに存在しているからです。

SecureStringただし、機密データはプログラム自体によって作成され、プログラムの操作が完了した後はメモリに残してはならないため、の使用が推奨されるシナリオは他にもあります。たとえば、SharePointサイトをプログラムで作成したり、認証資格情報をあるシステムから別のシステムに転送したりします。

古き良き時代には、機密データの存続期間を可能な限り短くすることが容易でした。スタックに割り当てて、プログラムがそれを使用して完了するとすぐにクリアすることができます。

char secret[512];
generate_secret(secret, sizeof(secret));
do_something_with(secret);
memset(secret, 0, sizeof(secret));
// Secret data is now gone.

ただし、主に次の理由により、マネージド文字列ではこのようなアプローチは不可能です。

  • それらはスタックに割り当てられていません、
  • それらは不変であるため、クリアすることはできません。
  • それらは使い捨てではないため、GCがデータを解放する時間についての保証はありません。メモリの状態によっては、解放されない場合もあります。

SecureString可変で使い捨てにすることでその問題を解決しようとします。これにより、次のように書くことができます。

using (SecureString secret = new SecureString()) {
    GenerateSecret(secret);
    secret.MakeReadOnly();
    DoSomethingWith(secret);
}
// Secret data is now gone.
于 2010-12-17T09:35:36.687 に答える
7

SecureString は、システム間の直接呼び出しにネットワーク資格情報を割り当てるのに最適です。Web アリーナでは、資格情報が Web 経由で受信された場合、それはどこかでプレーンテキストになっていることは当然のことですが、その資格情報を標準の資格情報呼び出し (ftp、ディレクトリ サービスなど) を介して返送する必要がある場合は、SecureString を使用すると通過方法としては痛くありません。文字列が既にプレーン テキストでサーバー システムにあることは正しいのですが、少なくともシステム間のフットプリントを減らすことができます。このパスワードをローカルでのみ使用している場合、SecureString はおそらくそれほど必要ではないことに同意します。

ただし、優れたセキュリティの習慣は決して時間の無駄ではありません。

于 2010-12-16T18:31:55.463 に答える
6

基礎は身に付いていると思います。SecureString は、クライアント側にあるという観点から設計されています。したがって、WPF/Winforms アプリ (および、Silverlight がそこにあるかどうかを覚えていない可能性があります) の場合、サーバー側のアプリの場合は、文字列を最初に処理するわけではないため、それほど価値はありません。

于 2010-12-16T18:28:33.170 に答える