SecureString クラス

定義

不要になったときにコンピューターのメモリから削除するなどして機密を保持する必要があるテキストを表します。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
実装

次の例では、を使用し 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.
              securePwd.AppendChar(key.KeyChar);
              Console.Write("*");
           }   
        // Exit if Enter key is pressed.
        } while (key.Key != ConsoleKey.Enter);
        Console.WriteLine();
        
        try {
            Process.Start("Notepad.exe", "MyUser", securePwd, "MYDOMAIN");
        }
        catch (Win32Exception e) {
            Console.WriteLine(e.Message);
        }
        finally {
           securePwd.Dispose();
        }
    }
}
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: ")
        Do
           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.
              securePwd.AppendChar(key.KeyChar)
              Console.Write("*")
           End If                                    
        ' Exit if Enter key is pressed.
        Loop While key.Key <> ConsoleKey.Enter
        Console.WriteLine()
        
        Try
            Process.Start("Notepad.exe", "MyUser", securePwd, "MYDOMAIN")
        Catch e As Win32Exception
            Console.WriteLine(e.Message)
        Finally
           securePwd.Dispose()
        End Try
    End Sub
End Class

注釈

重要

新しい開発にはクラスを使用しないことをお勧めし SecureString ます。We don't recommend that you use the SecureString class for new development. 詳細については、GitHub で SecureString を使用しない でください。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. (ただし、制限については、「 How to secure Is 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 は65536文字です。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:

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

String と SecureStringString 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.

オブジェクトは、 SecureString テキスト値を持つオブジェクトに似てい 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 ては、「 How to Secure is 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:

オブジェクトのインスタンス化 SecureStringInstantiate a SecureString object
オブジェクトをインスタンス化するには、 SecureString パラメーターなしのコンストラクターを呼び出します。You instantiate a SecureString object by calling its parameterless constructor.

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

重要

SecureStringオブジェクトをから構築することはできません String 。これは、機微なデータが、変更できないクラスのメモリの永続化によって既に影響を受けるためです StringA 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 は、メソッドなど、1回限りのアンマネージソースからです Console.ReadKeyThe best way to construct a SecureString object is from a character-at-a-time unmanaged source, such as the Console.ReadKey method.

オブジェクトから文字を削除する SecureStringRemove 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.

オブジェクトを読み取り専用にする SecureStringMake 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.

オブジェクトに関する情報を取得します。 SecureStringGet 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.

インスタンスに割り当てられたメモリを解放します。 SecureStringRelease 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 、の値を検査、比較、または変換するメンバーがありません SecureStringThe 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

オペレーティングシステムではが直接サポートされないため SecureStringSecureString 文字列をネイティブメソッドに渡す前に、オブジェクトの値を必要な文字列型に変換する必要があります。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 Zero および 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 複数の中間メモリが作成されますが、では SecureString 1 つのインスタンスのみが作成されます。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:

プラットフォームPlatform
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.

DurationDuration
実装で暗号化を利用できる場合でも、 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 and interop 」セクションを参照してください。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 自体の外部では、使用方法はサポートされません SecureStringHowever, 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 クラスの新しいインスタンスを初期化します。Initializes a new instance of the SecureString class.

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

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

メソッド

AppendChar(Char)

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

Clear()

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

Copy()

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

Dispose()

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

Equals(Object)

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

(継承元 Object)
GetHashCode()

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

(継承元 Object)
GetType()

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

(継承元 Object)
InsertAt(Int32, Char)

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

IsReadOnly()

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

MakeReadOnly()

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

MemberwiseClone()

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

(継承元 Object)
RemoveAt(Int32)

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

SetAt(Int32, Char)

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

ToString()

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

(継承元 Object)

適用対象

こちらもご覧ください