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:

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

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

重要

SecureString オブジェクトを 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 メソッドなど、1回限りのアンマネージソースからです。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 メソッドを呼び出して個々の文字を削除するか、Clear メソッドを呼び出して SecureString インスタンスからすべての文字を削除します。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
SecureStringIDisposable インターフェイスを実装するため、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. SecureString オブジェクトの値を操作するには、SecureStringToBSTR メソッドなどの System.Runtime.InteropServices.Marshal クラスの適切なメンバーを使用します。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 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.

  • セキュリティで保護された文字列の値が AppendCharRemoveAtなどのメソッドによって変更されるたびに、暗号化を解除し (プレーンテキストに変換)、変更してから再度暗号化する必要があります。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 自体の外部では、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.

全体として、機密性の高い文字列データの漏えいを制限するため、SecureStringString よりも安全性が高くなります。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)

適用対象

こちらもご覧ください