System.Security.SecureString クラス

重要

.NET (Core) での新しい開発や、既存のコードを .NET (Core) に移行する場合は、このクラスを使用 SecureString しないことをお勧めします。 詳細については、「SecureString を使用しないでください」を参照してください

この記事では、この API のリファレンス ドキュメントへの補足的な解説を提供します。

SecureString は、セキュリティの尺度を提供する文字列型です。 機密性の高い文字列がプレーン テキストとしてプロセス メモリに格納されるのを回避しようとします。 (ただし、制限事項については 、SecureString のセキュリティはどのくらいですか? section.)インスタンスの値は、インスタンス SecureString が初期化されたとき、または値が変更されたときに、基になるプラットフォームでサポートされているメカニズムを使用して自動的に保護されます。 アプリケーションは、インスタンスを変更不可にレンダリングし、メソッドを呼び出すことによってさらなる変更を MakeReadOnly 防ぐことができます。

インスタンスの SecureString 最大長は 65,536 文字です。

重要

この型は IDisposable インターフェイスを実装します。 型のインスタンスの使用が完了したら、直接または間接的に破棄する必要があります。 直接的に型を破棄するには、try/catch ブロック内で Dispose メソッドを呼び出します。 間接的に型を破棄するには、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追加します。オブジェクトまたはInsertAtメソッドを呼び出すことで、SecureString一度に 1 つの文字をオブジェクトにAppendChar追加できます。

重要

SecureString機密データは、変更できないStringクラスのメモリ永続化の結果の影響を既に受けるので、オブジェクトを作成Stringしないでください。 オブジェクトを構築する最善の SecureString 方法は、メソッドなどの Console.ReadKey 一度に文字のアンマネージド ソースから行う方法です。

オブジェクトから文字をSecureString削除する メソッドを呼び出して個々の文字を置き換えたり、メソッドをSetAt呼び出して個々の文字をRemoveAt削除したり、メソッドを呼び出してインスタンスからすべての文字をSecureStringClear削除したりできます。

オブジェクトを SecureString 読み取り専用にする オブジェクトが表す文字列を SecureString 定義したら、その MakeReadOnly メソッドを呼び出して文字列を読み取り専用にします。

オブジェクトSecureStringに関する情報をSecureString取得します。このクラスには、文字列に関する情報をLength提供する 2 つのメンバー (文字列内の UTF16 でエンコードされたコード単位の数を示すプロパティ) とIsReadOnly、インスタンスが読み取り専用かどうかを示す 、メソッドの 2 つしかありません。

インスタンスに割り当てられたメモリをSecureString解放します。インターフェイスがIDisposable実装されているためSecureString、メソッドを呼び出してメモリをDispose解放します。

クラス SecureString には、値を検査、比較、または変換する SecureStringメンバーがありません。 このようなメンバーが存在しないことは、インスタンスの価値を偶発的または悪意のある露出から保護するのに役立ちます。 クラスの System.Runtime.InteropServices.Marshal 適切なメンバー (メソッドなど) を SecureStringToBSTR 使用して、オブジェクトの値を SecureString 操作します。

.NET クラス ライブラリでは、通常、次の方法でインスタンスが使用 SecureString されます。

SecureString と相互運用

オペレーティング システムは直接サポート SecureStringしていないため、文字列をネイティブ メソッドに渡す前に、オブジェクトの SecureString 値を必要な文字列型に変換する必要があります。 この Marshal クラスには、これを行う 5 つのメソッドがあります。

これらの各メソッドは、アンマネージ メモリにクリア テキスト文字列を作成します。 不要になったらすぐにそのメモリをゼロにして解放するのは開発者の責任です。 各文字列変換メソッドとメモリ割り当てメソッドには、割り当てられたメモリをゼロアウトして解放する対応するメソッドがあります。

割り当ておよび変換方法 ゼロとフリーのメソッド
Marshal.SecureStringToBSTR Marshal.ZeroFreeBSTR
Marshal.SecureStringToCoTaskMemAnsi Marshal.ZeroFreeCoTaskMemAnsi
Marshal.SecureStringToCoTaskMemUnicode Marshal.ZeroFreeCoTaskMemUnicode
Marshal.SecureStringToGlobalAllocAnsi Marshal.ZeroFreeGlobalAllocAnsi
Marshal.SecureStringToGlobalAllocUnicode Marshal.ZeroFreeGlobalAllocUnicode

SecureString のセキュリティはどのくらいですか?

適切に作成されると、インスタンスは SecureStringString. 文字一時ソースから文字列を作成する場合は、 String メモリ内に複数の中間を作成します SecureString が、1 つのインスタンスのみを作成します。 オブジェクトの String ガベージ コレクションは非決定的です。 また、メモリが固定されていないため、ガベージ コレクターはメモリの移動と圧縮時に値の String 追加コピーを作成します。 これに対し、オブジェクトに SecureString 割り当てられたメモリは固定され、メソッドを呼び出すことによってそのメモリを Dispose 解放できます。

インスタンスに格納されるデータは、インスタンスに SecureString 格納されている String データよりも安全ですが、インスタンスのセキュリティ SecureString を確保する方法には大きな制限があります。 これには以下が含まれます。

プラットフォーム

Windows オペレーティング システムでは、インスタンスの内部文字配列の SecureString 内容が暗号化されます。 ただし、API が不足しているか、キー管理の問題が原因であるかに関係なく、暗号化はすべてのプラットフォームで使用できるわけではありません。 このプラットフォームの依存関係のため、 SecureString Windows 以外のプラットフォーム上の内部ストレージは暗号化されません。 その他の手法は、追加の保護を提供するためにこれらのプラットフォームで使用されます。

Duration

実装で SecureString 暗号化を利用できる場合でも、インスタンスに割り当てられた SecureString プレーン テキストは、さまざまな時間に公開される可能性があります。

  • Windows ではオペレーティング システム レベルでセキュリティで保護された文字列の実装が提供されていないため、使用するには、セキュリティで保護された文字列値をプレーン テキスト表現に変換する必要があります。

  • セキュリティRemoveAtで保護された文字列の値がメソッドによってAppendChar変更されるたびに、暗号化を解除し (つまり、プレーン テキストに戻す)、変更してから、もう一度暗号化する必要があります。

  • 相互運用呼び出しでセキュリティで保護された文字列を使用する場合は、ANSI 文字列、Unicode 文字列、またはバイナリ文字列 (BSTR) に変換する必要があります。 詳細については、「SecureString と相互運用」セクションを参照してください。

インスタンスの値が SecureString 公開される時間間隔は、クラスと比較して String 単純に短縮されます。

ストレージと使用法 より一般的には、このクラスは、 SecureString 保護または機密保持する必要がある文字列値のストレージ メカニズムを定義します。 ただし、.NET 自体の外部では、使用メカニズムは SecureStringサポートされていません。 つまり、セキュリティで保護された文字列は、ターゲットで認識できる使用可能な形式 (通常はクリア テキスト 形式) に変換する必要があり、復号化と変換はユーザー空間で行う必要があります。

全体として、 SecureString 機密性の高い文字列データの公開が制限されるためよりも String 安全です。 ただし、これらの文字列は、ホスト コンピューターで実行されている悪意のあるプロセス、プロセス ダンプ、ユーザーが表示可能なスワップ ファイルなど、生メモリにアクセスできるプロセスや操作に公開される可能性があります。 パスワードを保護する代わりに、プロセスの SecureString 外部に格納されている資格情報に不透明なハンドルを使用することをお勧めします。