Von Bedeutung
.NET (Core) での新しい開発や、既存のコードを .NET (Core) に移行する場合は、 SecureString
クラスを使用しないことをお勧めします。 詳細については、「 SecureString を使用しないでください」を参照してください。
この記事では、この API のリファレンス ドキュメントに補足的な解説を提供します。
SecureString は、セキュリティの尺度を提供する文字列型です。 機密性の高い文字列がプレーン テキストとしてプロセス メモリに格納されるのを回避しようとします。 (ただし、制限事項については、 SecureString のセキュリティ保護に 関するセクションを参照してください)。 SecureString のインスタンスの値は、インスタンスが初期化されたとき、または値が変更されたときに、基になるプラットフォームでサポートされるメカニズムを使用して自動的に保護されます。 アプリケーションは、 MakeReadOnly メソッドを呼び出すことによって、インスタンスを不変にレンダリングし、それ以上の変更を防ぐことができます。
SecureString インスタンスの最大長は 65,536 文字です。
Von Bedeutung
この型は、IDisposable インターフェイスを実装します。 型のインスタンスの使用が完了したら、直接または間接的に破棄する必要があります。 型を直接破棄するには、Disposetry
/ ブロックでその catch
メソッドを呼び出します。 間接的に破棄するには、using
(C#) や Using
(Visual Basic) などの言語コンストラクトを使用します。 詳細については、 IDisposable インターフェイスのトピックの「IDisposable を実装するオブジェクトの使用」セクションを参照してください。
SecureString クラスとそのメンバーは COM には表示されません。 詳細については、ComVisibleAttributeを参照してください。
文字列と SecureString
System.String クラスのインスタンスはどちらも不変であり、不要になった場合は、ガベージ コレクション用にプログラムでスケジュールすることはできません。つまり、インスタンスは作成後に読み取り専用になり、インスタンスがいつコンピューター のメモリから削除されるかを予測することはできません。 System.Stringインスタンスは不変であるため、既存のインスタンスを変更するように見える操作では、実際に操作するコピーが作成されます。 したがって、 String オブジェクトにパスワード、クレジット カード番号、個人データなどの機密情報が含まれている場合、アプリケーションがコンピューター のメモリからデータを削除できないため、使用後に情報が表示されるリスクがあります。
SecureString オブジェクトは、テキスト値を持つという点で、String オブジェクトに似ています。 ただし、 SecureString オブジェクトの値はメモリに固定され、基になるオペレーティング システムによって提供される暗号化などの保護メカニズムを使用できます。アプリケーションで読み取り専用としてマークされるまで変更でき、 Dispose メソッドを呼び出すアプリケーションまたは .NET ガベージ コレクターによってコンピューター メモリから削除できます。
SecureString クラスの制限事項については、「SecureString のセキュリティ保護方法」セクションを参照してください。
SecureString 操作
SecureString クラスには、次の操作を実行できるメンバーが含まれています。
SecureString オブジェクトをインスタンス化する パラメーターなしのコンストラクターを呼び出して、SecureString オブジェクトをインスタンス化します。
SecureString オブジェクトに文字を追加する AppendChar または InsertAt メソッドを呼び出すことで、SecureString オブジェクトに一度に 1 つの文字を追加できます。
Von Bedeutung
機密データは既に不変のString クラスのメモリ永続化の影響を受けるので、SecureString オブジェクトをStringから構築しないでください。 SecureString オブジェクトを構築する最善の方法は、Console.ReadKey メソッドなどの一度に文字が含まれるアンマネージ ソースからの方法です。
SecureString オブジェクトから文字を削除する SetAt メソッドを呼び出して個々の文字を置き換えたり、RemoveAt メソッドを呼び出して個々の文字を削除したり、Clear メソッドを呼び出してSecureString インスタンスからすべての文字を削除したりできます。
SecureString オブジェクトを読み取り専用にする SecureString オブジェクトが表す文字列を定義したら、そのMakeReadOnly メソッドを呼び出して文字列を読み取り専用にします。
SecureString オブジェクトに関する情報を取得する SecureString クラスには、文字列に関する情報を提供する 2 つのメンバー (文字列内の UTF16 でエンコードされたコード単位の数を示す Length プロパティ)、およびインスタンスが読み取り専用かどうかを示す IsReadOnly メソッドの 2 つのメンバーのみが含まれます。
SecureString インスタンスに割り当てられたメモリを解放します。SecureStringはIDisposable インターフェイスを実装しているため、Dispose メソッドを呼び出してメモリを解放します。
SecureString クラスには、SecureStringの値を検査、比較、または変換するメンバーがありません。 このようなメンバーが存在しないことは、インスタンスの価値を偶発的または悪意のある露出から保護するのに役立ちます。 SecureString オブジェクトの値を操作するには、SecureStringToBSTR メソッドなどのSystem.Runtime.InteropServices.Marshal クラスの適切なメンバーを使用します。
.NET クラス ライブラリでは、通常、次の方法で SecureString インスタンスが使用されます。
ProcessStartInfo構造体を使用するか、SecureString型のパラメーターを持つProcess.Start メソッドのオーバーロードを呼び出して、プロセスにパスワード情報を提供します。
SecureString型のパラメーターを持つNetworkCredential クラス コンストラクターを呼び出すか、NetworkCredential.SecurePassword プロパティを使用して、ネットワーク パスワード情報を提供します。
SqlCredential.SqlCredential コンストラクターを呼び出すか、SqlCredential.Password プロパティの値を取得して、SQL Server 認証のパスワード情報を提供します。
アンマネージ コードに文字列を渡す。 詳細については、「 SecureString と相互運用」 セクションを参照してください。
SecureString と相互運用
オペレーティング システムは SecureStringを直接サポートしていないため、文字列をネイティブ メソッドに渡す前に、 SecureString オブジェクトの値を必要な文字列型に変換する必要があります。 Marshal クラスには、これを行う 5 つのメソッドがあります。
Marshal.SecureStringToBSTRは、 SecureString 文字列値を COM によって認識されるバイナリ文字列 (BSTR) に変換します。
Marshal.SecureStringToCoTaskMemAnsi Marshal.SecureStringToGlobalAllocAnsi。アンマネージド メモリ内の ANSI 文字列にSecureString文字列値をコピーします。
Marshal.SecureStringToCoTaskMemUnicode Marshal.SecureStringToGlobalAllocUnicode。SecureString文字列値をアンマネージ メモリ内の Unicode 文字列にコピーします。
これらの各メソッドは、アンマネージ メモリにクリア テキスト文字列を作成します。 不要になったらすぐにそのメモリをゼロにして解放するのは開発者の責任です。 各文字列変換メソッドとメモリ割り当てメソッドには、割り当てられたメモリをゼロアウトして解放する対応するメソッドがあります。
SecureString のセキュリティはどのくらいですか?
適切に作成されると、 SecureString インスタンスは Stringよりも多くのデータ保護を提供します。 文字一時ソースから文字列を作成する場合、 String はメモリ内に複数の中間を作成しますが、 SecureString は単一のインスタンスのみを作成します。 String オブジェクトのガベージ コレクションは非決定的です。 さらに、メモリが固定されていないため、ガベージ コレクターはメモリの移動と圧縮時に String 値の追加のコピーを作成します。 これに対し、 SecureString オブジェクトに割り当てられたメモリは固定されており、 Dispose メソッドを呼び出すことによってそのメモリを解放できます。
SecureString インスタンスに格納されるデータは、String インスタンスに格納されているデータよりも安全ですが、SecureString インスタンスのセキュリティ保護に大きな制限があります。 これらには次のものが含まれます。
プラットホーム
Windows オペレーティング システムでは、 SecureString インスタンスの内部文字配列の内容が暗号化されます。 ただし、API が不足しているか、キー管理の問題が原因であるかに関係なく、暗号化はすべてのプラットフォームで使用できるわけではありません。 このプラットフォームの依存関係のため、 SecureString は Windows 以外のプラットフォーム上の内部ストレージを暗号化しません。 その他の手法は、追加の保護を提供するためにこれらのプラットフォームで使用されます。
期間
SecureString実装で暗号化を利用できる場合でも、SecureString インスタンスに割り当てられたプレーン テキストは、さまざまな時間に公開される可能性があります。
Windows ではオペレーティング システム レベルでセキュリティで保護された文字列の実装が提供されていないため、使用するには、セキュリティで保護された文字列値をプレーン テキスト表現に変換する必要があります。
セキュリティで保護された文字列の値が AppendChar や RemoveAtなどのメソッドによって変更されるたびに、暗号化を解除 (つまり、プレーン テキストに変換)、変更してから、もう一度暗号化する必要があります。
相互運用呼び出しでセキュリティで保護された文字列を使用する場合は、ANSI 文字列、Unicode 文字列、またはバイナリ文字列 (BSTR) に変換する必要があります。 詳細については、「 SecureString と相互運用」 セクションを参照してください。
SecureString インスタンスの値が公開される時間間隔は、String クラスと比較して単純に短縮されます。
ストレージと使用法 より一般的には、 SecureString クラスは、保護または機密保持する必要がある文字列値のストレージ メカニズムを定義します。 ただし、.NET 自体の外部では、 SecureStringをサポートする使用メカニズムはありません。 つまり、セキュリティで保護された文字列は、ターゲットで認識できる使用可能な形式 (通常はクリア テキスト 形式) に変換する必要があり、復号化と変換はユーザー空間で行う必要があります。
全体として、 SecureString は機密文字列データの公開を制限するため、 String よりも安全です。 ただし、これらの文字列は、ホスト コンピューターで実行されている悪意のあるプロセス、プロセス ダンプ、ユーザーが表示可能なスワップ ファイルなど、生メモリにアクセスできるプロセスや操作に公開される可能性があります。 SecureStringを使用してパスワードを保護する代わりに、プロセスの外部に格納されている資格情報に不透明なハンドルを使用することをお勧めします。
.NET