SecureString SecureString SecureString SecureString Class


不要になったときにコンピューターのメモリから削除するなどして機密を保持する必要があるテキストを表します。Represents text that should be kept confidential, such as by deleting it from computer memory when no longer needed. このクラスは継承できません。This class cannot be inherited.

public ref class SecureString sealed : IDisposable
public sealed class SecureString : IDisposable
type SecureString = class
    interface IDisposable
Public NotInheritable Class SecureString
Implements IDisposable

次の例では、使用する方法、SecureString新しいプロセスを開始する資格情報として使用するためのユーザーのパスワードをセキュリティで保護します。The following example demonstrates how to use a SecureString to secure a user's password for use as a credential to start a new process.

using System;
using System.ComponentModel;
using System.Diagnostics;
using System.Security;

public class Example
    public static void Main()
        // Instantiate the secure string.
        SecureString securePwd = new SecureString();
        ConsoleKeyInfo key;

        Console.Write("Enter password: ");
        do {
           key = Console.ReadKey(true);
           // Ignore any key out of range.
           if (((int) key.Key) >= 65 && ((int) key.Key <= 90)) {
              // Append the character to the password.
        // Exit if Enter key is pressed.
        } while (key.Key != ConsoleKey.Enter);
        try {
            Process.Start("Notepad.exe", "MyUser", securePwd, "MYDOMAIN");
        catch (Win32Exception e) {
        finally {
Imports System.ComponentModel
Imports System.Diagnostics
Imports System.Security

Public Class Example
    Public Shared Sub Main()
        ' Instantiate the secure string.
        Dim securePwd As New SecureString()
        Dim key As ConsoleKeyInfo
        Console.Write("Enter password: ")
           key = Console.ReadKey(True)

           ' Ignore any key out of range
           If CInt(key.Key) >= 65 And CInt(key.Key <= 90) Then    
              ' Append the character to the password.
           End If                                    
        ' Exit if Enter key is pressed.
        Loop While key.Key <> ConsoleKey.Enter
            Process.Start("Notepad.exe", "MyUser", securePwd, "MYDOMAIN")
        Catch e As Win32Exception
        End Try
    End Sub
End Class



使用することをお勧めしません、SecureStringクラスの新しい開発します。We don't recommend that you use the SecureString class for new development. 詳細については、次を参照してください。 SecureString を使用してはならないGitHub でします。For more information, see SecureString shouldn't be used on GitHub.

SecureString セキュリティ対策を提供する文字列型です。SecureString is a string type that provides a measure of security. 可能性のある機密性の高い文字列をプレーン テキストとしてプロセス メモリに格納しないようにしようとします。It tries to avoid storing potentially sensitive strings in process memory as plain text. (ただし、参照制限については、 SecureString はどのくらい安全でしょうかセクションです。)。インスタンスの値SecureStringインスタンスが初期化されるときに、または値が変更されたときに、基になるプラットフォームでサポートされているメカニズムを使用して自動的に保護します。(For limitations, however, see the How secure is SecureString? section.) The value of an instance of SecureString is automatically protected using a mechanism supported by the underlying platform when the instance is initialized or when the value is modified. アプリケーションがインスタンスを変更できないレンダリングし、呼び出すことによってさらに変更を防ぐため、MakeReadOnlyメソッド。Your application can render the instance immutable and prevent further modification by invoking the MakeReadOnly method.

最大長をSecureStringインスタンスが 65,536 文字。The maximum length of a SecureString instance is 65,536 characters.


この型は IDisposable インターフェイスを実装します。This type implements the IDisposable interface. 型のインスタンスを使用してが完了したら、直接的または間接的にそれを破棄する必要があります。When you have finished using an instance of the type, you should dispose of it either directly or indirectly. 直接的に型を破棄するには、try / catch ブロック内で Dispose メソッドを呼び出します。To dispose of the type directly, call its Dispose method in a try/catch block. 間接的に型を破棄するには、using (C# の場合) または Using (Visual Basic 言語) などの言語構成要素を使用します。To dispose of it indirectly, use a language construct such as using (in C#) or Using (in Visual Basic). 詳細については、IDisposable インターフェイスに関するトピック内の「IDisposable を実装するオブジェクトの使用」セクションを参照してください。For more information, see the "Using an Object that Implements IDisposable" section in the IDisposable interface topic.

SecureStringクラスとそのメンバーが COM に表示されません。The SecureString class and its members are not visible to COM. 詳細については、「ComVisibleAttribute」を参照してください。For more information, see ComVisibleAttribute.

このセクションの内容:In this section:

Vs の文字列を指定します。SecureString String vs. SecureString
SecureString 操作 SecureString operations
SecureString と相互運用機能 SecureString and interop
SecureString はどのようにセキュリティで保護されたのですか。How secure is SecureString?

SecureString と文字列String versus SecureString

インスタンス、System.Stringクラスは、両方の変更できないと、不要になったときにガベージ コレクションのプログラムでスケジュールできませんつまり、インスタンスは読み取り専用が作成されると、インスタンスがになりますを予測することはできません。コンピューターのメモリから削除されます。An instance of the System.String class is both immutable and, when no longer needed, cannot be programmatically scheduled for garbage collection; that is, the instance is read-only after it is created, and it is not possible to predict when the instance will be deleted from computer memory. System.Stringインスタンスが変更可能な既存のインスタンスを変更する表示される操作が実際に操作のコピーを作成します。Because System.String instances are immutable, operations that appear to modify an existing instance actually create a copy of it to manipulate. そのため場合、Stringオブジェクトには、パスワード、クレジット_カード番号、または個人データなどの機密情報が含まれています、アプリケーションは、コンピューターのメモリから、データを削除できないため、使用後、情報が盗まれるリスクがあります。Consequently, if a String object contains sensitive information such as a password, credit card number, or personal data, there is a risk the information could be revealed after it is used because your application cannot delete the data from computer memory.

ASecureStringオブジェクトと似ています、Stringオブジェクトのテキスト値を持つことにします。A SecureString object is similar to a String object in that it has a text value. ただしの値をSecureStringオブジェクトがメモリに固定されている、アプリケーションが読み取り専用としてマークされるまで、基になるオペレーティング システムによって提供される、暗号化を変更できるよう保護機構を使用する可能性があります、コンピューターのメモリから削除できますいずれか、アプリケーションを呼び出すことによって、Disposeメソッドまたは .NET Framework のガベージ コレクターによって。However, the value of a SecureString object is pinned in memory, may use a protection mechanism, such as encryption, provided by the underlying operating system, can be modified until your application marks it as read-only, and can be deleted from computer memory either by your application calling the Dispose method or by the .NET Framework garbage collector.

制限事項の詳細については、SecureStringクラスを参照してください、 SecureString はどのくらい安全でしょうか。セクション。For a discussion of the limitations of the SecureString class, see the How secure is SecureString? section.

ページのトップへBack to top

SecureString 操作SecureString operations

SecureStringクラスには、次を実行するためのメンバーが含まれています。The SecureString class includes members that allow you to do the following:

インスタンスを作成、SecureStringオブジェクトInstantiate a SecureString object
インスタンス化する、SecureStringパラメーターなしのコンス トラクターを呼び出すことによってオブジェクト。You instantiate a SecureString object by calling its parameterless constructor.

文字を追加、SecureStringオブジェクトAdd characters to a SecureString object
一度に 1 つの文字を追加することができます、SecureStringオブジェクトを呼び出すことによってそのAppendCharまたはInsertAtメソッド。You can add a single character at a time to a SecureString object by calling its AppendChar or InsertAt method.


ASecureStringからオブジェクトを構築しない必要があります、String機微なデータが変更できないのメモリの永続化の結果の対象が既にあるため、Stringクラス。A SecureString object should never be constructed from a String, because the sensitive data is already subject to the memory persistence consequences of the immutable String class. 構築する最善の方法、SecureStringなどは、時間での文字の管理されていないソースからオブジェクト、Console.ReadKeyメソッド。The best way to construct a SecureString object is from a character-at-a-time unmanaged source, such as the Console.ReadKey method.

文字を削除、SecureStringオブジェクトRemove characters from a SecureString object
呼び出すことによって、個々 の文字を置き換えることができます、SetAtメソッドを呼び出すことによって、個々 の文字を削除、RemoveAtメソッド、またはすべての文字から削除、SecureStringインスタンスを呼び出すことによって、Clearメソッド。You can replace an individual character by calling the SetAt method, remove an individual character by calling the RemoveAt method, or remove all characters from the SecureString instance by calling the Clear method.

ように、SecureString読み取り専用オブジェクトMake the SecureString object read-only
定義すると、文字列をSecureStringオブジェクトを表し、呼び出すことがそのMakeReadOnly読み取り専用文字列を作成するメソッド。Once you have defined the string that the SecureString object represents, you call its MakeReadOnly method to make the string read-only.

に関する情報を取得、SecureStringオブジェクトGet information about the SecureString object
SecureStringクラスには、文字列についての情報を提供する 2 つだけのメンバー: そのLength文字列で UTF16 でエンコードされたコード ユニットの数を示すプロパティとIsReadOnlyメソッドは、インスタンスがかどうかを示します読み取り専用です。The SecureString class has only two members that provide information about the string: its Length property, which indicates the number of UTF16-encoded code units in the string; and the IsReadOnly, method, which indicates whether the instance is read-only.

割り当てられたメモリの解放、SecureStringインスタンスRelease the memory allocated to the SecureString instance
SecureString実装、IDisposableインターフェイスを呼び出すことによって、メモリを解放する、Disposeメソッド。Because SecureString implements the IDisposable interface, you release its memory by calling the Dispose method.

SecureStringクラスが検査、比較、またはの値を変換するメンバーを持たない、SecureStringします。The SecureString class has no members that inspect, compare, or convert the value of a SecureString. このようなメンバーがない場合は、誤ってまたは悪意のある露出からのインスタンスの値を保護します。The absence of such members helps protect the value of the instance from accidental or malicious exposure. 適切なメンバーを使用して、System.Runtime.InteropServices.Marshalクラスなど、SecureStringToBSTRの値を操作するメソッド、SecureStringオブジェクト。Use appropriate members of the System.Runtime.InteropServices.Marshal class, such as the SecureStringToBSTR method, to manipulate the value of a SecureString object.

よく使われる、.NET Framework クラス ライブラリSecureString次の方法でインスタンス。The .NET Framework Class Library commonly uses SecureString instances in the following ways:

ページのトップへBack to top

SecureString と相互運用機能SecureString and interop

オペレーティング システムは直接サポートされていませんSecureStringの値を変換する必要があります、SecureStringネイティブ メソッドを文字列を渡す前に必要な文字列型のオブジェクト。Because the operating system does not directly support SecureString, you must convert the value of the SecureString object to the required string type before passing the string to a native method. Marshalクラスがこれを実行する 5 つのメソッドには。The Marshal class has five methods that do this:

これらの各メソッドは、アンマネージ メモリ内、クリア テキスト文字列を作成します。Each of these methods creates a clear-text string in unmanaged memory. ゼロにして、不要になったとすぐにそのメモリを解放する開発者の役目です。It is the responsibility of the developer to zero out and free that memory as soon as it is no longer needed. 各文字列変換とメモリの割り当て方法、対応するメソッドをゼロにし、割り当てられたメモリを解放するには。Each of the string conversion and memory allocation methods has a corresponding method to zero out and free the allocated memory:

割り当てと変換メソッドAllocation and conversion method 0 と free メソッドZero and free method
Marshal.SecureStringToBSTR Marshal.ZeroFreeBSTR
Marshal.SecureStringToCoTaskMemAnsi Marshal.ZeroFreeCoTaskMemAnsi
Marshal.SecureStringToCoTaskMemUnicode Marshal.ZeroFreeCoTaskMemUnicode
Marshal.SecureStringToGlobalAllocAnsi Marshal.ZeroFreeGlobalAllocAnsi
Marshal.SecureStringToCoTaskMemUnicode Marshal.ZeroFreeGlobalAllocUnicode

ページのトップへBack to top

SecureString はどのようにセキュリティで保護されたのですか。How secure is SecureString?

正常に作成されたときに、SecureStringインスタンスよりも多くのデータ保護を提供する、Stringします。When created properly, a SecureString instance provides more data protection than a String. 時間での文字のソースから文字列を作成するときにString、メモリ内で複数の中間を作成できませんではSecureString1 つのインスタンスを作成します。When creating a string from a character-at-a-time source, String creates multiple intermediate in memory, whereas SecureString creates just a single instance. ガベージ コレクションのStringオブジェクトは非確定的です。Garbage collection of String objects is non-deterministic. さらに、そのメモリが固定されていないため、ガベージ コレクターは追加のコピーを作成String値の移動とメモリを圧縮します。In addition, because its memory is not pinned, the garbage collector will make additional copies of String values when moving and compacting memory. これに対しに割り当てられた、メモリ、SecureStringオブジェクトが固定されているし、そのメモリを呼び出すことによって解放できる、Disposeメソッド。In contrast, the memory allocated to a SecureString object is pinned, and that memory can be freed by calling the Dispose method.

格納されているデータが、SecureStringインスタンスが格納されているデータよりも安全、Stringインスタンスのセキュリティで保護する方法の大きな制限がある、SecureStringインスタンスがします。Although data stored in a SecureString instance is more secure than data stored in a String instance, there are significant limitations on how secure a SecureString instance is. 次の設定があります。These include:

Windows オペレーティング システムでの内容をSecureStringインスタンスの内部文字配列が暗号化されます。On the Windows operating system, the contents of a SecureString instance's internal character array are encrypted. ただし、Api またはキー管理の問題がない、ためかどうかの暗号化は使用できませんのすべてのプラットフォームです。However, whether because of missing APIs or key management issues, encryption is not available on all platforms. このプラットフォームの依存関係のためSecureString非 Windows プラットフォーム上の内部記憶域では暗号化されません。Because of this platform dependency, SecureString does not encrypt the internal storage on non-Windows platform. その他の手法は、追加の保護を提供するこれらのプラットフォームで使用されます。Other techniques are used on those platforms to provide additional protection.

場合でも、SecureString実装が暗号化を活用するためにプレーン テキストが割り当てられている、SecureStringインスタンスは、さまざまなタイミングで公開する可能性があります。Even if the SecureString implementation is able to take advantage of encryption, the plain text assigned to the SecureString instance may be exposed at various times:

  • Windows がオペレーティング システム レベルでセキュリティで保護された文字列の実装を提供していませんので、.NET Framework はまだをプレーン テキスト形式が使用するには、セキュリティで保護された文字列値を変換します。Because Windows doesn't offer a secure string implementation at the operating system level, the .NET Framework still has to convert the secure string value to its plain text representation in order to use it.

  • たびにセキュリティで保護された文字列の値は、メソッドによって変更などAppendCharまたはRemoveAt、その必要がありますの暗号化を解除 (つまり、変換されるプレーン テキストに戻す)、変更され、再度暗号化されます。Whenever the value of the secure string is modified by methods such as AppendChar or RemoveAt, it must be decrypted (that is, converted back to plain text), modified, and then encrypted again.

  • 相互運用機能の呼び出しで、セキュリティで保護された文字列を使用する場合は、ANSI 文字列、Unicode 文字列、またはバイナリ文字列 (BSTR) に変換する必要があります。If the secure string is used in an interop call, it must be converted to an ANSI string, a Unicode string, or a binary string (BSTR). 詳細については、次を参照してください。、 SecureString と相互運用機能セクション。For more information, see the SecureString and interop section.

対象の時間間隔、SecureStringインスタンスの値が公開されている比較する短縮だけで、Stringクラス。The time interval for which the SecureString instance's value is exposed is merely shortened in comparison to the String class.

ストレージ使用量とStorage versus usage
一般的に、SecureStringクラスは、保護されているまたは機密性を保持する文字列値を格納するメカニズムを定義します。More generally, the SecureString class defines a storage mechanism for string values that should be protected or kept confidential. ただし、.NET Framework 自体の外部で使用状況のメカニズムをサポートするSecureStringします。However, outside of the .NET Framework itself, no usage mechanism supports SecureString. つまり、セキュリティで保護された文字列をそのターゲットが認識できる使用可能な形式 (通常はクリア テキスト形式) に変換する必要があります、復号化し、変換は、ユーザー領域で発生する必要があります。This means that the secure string must be converted to a usable form (typically a clear text form) that can be recognized by its target, and that decryption and conversion must occur in user space.

全体として、SecureStringよりも安全String機密性の高い文字列データの露出を制限するためです。Overall, SecureString is more secure than String because it limits the exposure of sensitive string data. ただし、これらの文字列であり、まだしたプロセスまたはホスト コンピューター、プロセスのダンプ、またはユーザー表示可能なスワップ ファイルで実行されている悪意のあるプロセスなどの生のメモリにアクセスできる操作に公開する可能性があります。However, those strings may still be exposed to any process or operation that has access to raw memory, such as a malicious process running on the host computer, a process dump, or a user-viewable swap file. 使用する代わりにSecureStringパスワード保護のため、推奨される代替手段は、プロセスの外部で格納されている資格情報を非透過ハンドルを使用します。Instead of using SecureString to protect passwords, the recommended alternative is to use an opaque handle to credentials that are stored outside of the process.

ページのトップへBack to top


SecureString() SecureString() SecureString() SecureString()

SecureString クラスの新しいインスタンスを初期化します。Initializes a new instance of the SecureString class.

SecureString(Char*, Int32) SecureString(Char*, Int32) SecureString(Char*, Int32) SecureString(Char*, Int32)

Char オブジェクトのサブ配列から SecureString クラスの新しいインスタンスを初期化します。Initializes a new instance of the SecureString class from a subarray of Char objects.

このコンストラクターは、CLS 準拠ではありません。This constructor is not CLS-compliant. CLS 準拠の代わりとして SecureString() を使用できます。The CLS-compliant alternative is SecureString().


Length Length Length Length

現在のセキュリティ文字列内の文字数を取得します。Gets the number of characters in the current secure string.


AppendChar(Char) AppendChar(Char) AppendChar(Char) AppendChar(Char)

現在のセキュリティ文字列の末尾に、文字を 1 つ追加します。Appends a character to the end of the current secure string.

Clear() Clear() Clear() Clear()

現在のセキュリティ文字列の値を削除します。Deletes the value of the current secure string.

Copy() Copy() Copy() Copy()

現在のセキュリティ文字列のコピーを作成します。Creates a copy of the current secure string.

Dispose() Dispose() Dispose() Dispose()

現在の SecureString オブジェクトによって使用されているすべてのリソースを解放します。Releases all resources used by the current SecureString object.

Equals(Object) Equals(Object) Equals(Object) Equals(Object)

指定したオブジェクトが、現在のオブジェクトと等しいかどうかを判断します。Determines whether the specified object is equal to the current object.

(Inherited from Object)
GetHashCode() GetHashCode() GetHashCode() GetHashCode()

既定のハッシュ関数として機能します。Serves as the default hash function.

(Inherited from Object)
GetType() GetType() GetType() GetType()

現在のインスタンスの Type を取得します。Gets the Type of the current instance.

(Inherited from Object)
InsertAt(Int32, Char) InsertAt(Int32, Char) InsertAt(Int32, Char) InsertAt(Int32, Char)

このセキュリティ文字列の指定したインデックス位置に文字を挿入します。Inserts a character in this secure string at the specified index position.

IsReadOnly() IsReadOnly() IsReadOnly() IsReadOnly()

このセキュリティ文字列が読み取り専用としてマークされているかどうかを示します。Indicates whether this secure string is marked read-only.

MakeReadOnly() MakeReadOnly() MakeReadOnly() MakeReadOnly()

このセキュリティ文字列のテキスト値を読み取り専用にします。Makes the text value of this secure string read-only.

MemberwiseClone() MemberwiseClone() MemberwiseClone() MemberwiseClone()

現在の Object の簡易コピーを作成します。Creates a shallow copy of the current Object.

(Inherited from Object)
RemoveAt(Int32) RemoveAt(Int32) RemoveAt(Int32) RemoveAt(Int32)

このセキュリティ文字列の指定されたインデックス位置にある文字を削除します。Removes the character at the specified index position from this secure string.

SetAt(Int32, Char) SetAt(Int32, Char) SetAt(Int32, Char) SetAt(Int32, Char)

指定されたインデックス位置にある既存の文字を別の文字に置き換えます。Replaces the existing character at the specified index position with another character.

ToString() ToString() ToString() ToString()

現在のオブジェクトを表す文字列を返します。Returns a string that represents the current object.

(Inherited from Object)