SecureString クラス

定義

不要になったときにコンピューターのメモリから削除するなどして機密を保持する必要があるテキストを表します。 このクラスは継承できません。

public ref class SecureString sealed : IDisposable
public sealed class SecureString : IDisposable
type SecureString = class
    interface IDisposable
Public NotInheritable Class SecureString
Implements IDisposable
継承
SecureString
実装

次の例では、を使用し SecureString て、新しいプロセスを開始するための資格情報として使用するユーザーのパスワードをセキュリティで保護する方法を示します。

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 ます。 詳細については、「GitHub で使用しない」を参照してください。

SecureString は、セキュリティの手段を提供する文字列型です。 これは、処理メモリ内の機密性の高い文字列をプレーンテキストとして保存しないようにしようとします。 (ただし、制限については、「 How to secure Is SecureString? 」セクションを参照してください)。のインスタンスの値は、 SecureString インスタンスが初期化されたとき、または値が変更されたときに、基になるプラットフォームでサポートされる機構を使用して自動的に保護されます。 アプリケーションでインスタンスを変更不可として表示し、メソッドを呼び出すことによってさらに変更を防ぐことができ MakeReadOnly ます。

インスタンスの最大長 SecureString は65536文字です。

重要

この型は IDisposable インターフェイスを実装します。 型のインスタンスの使用が完了したら、直接または間接的に破棄する必要があります。 直接的に型を破棄するには、try/catch ブロック内で Dispose メソッドを呼び出します。 間接的に型を破棄するには、using (C# の場合) または Using (Visual Basic 言語) などの言語構成要素を使用します。 詳細については、IDisposable インターフェイスに関するトピック内の「IDisposable を実装するオブジェクトの使用」セクションを参照してください。

SecureStringクラスとそのメンバーは、COM からは参照できません。 詳細については、「ComVisibleAttribute」を参照してください。

このセクションの内容は次のとおりです。

文字列と SecureString
SecureString 操作
SecureString と相互運用
SecureString はどのようにセキュリティで保護されていますか。

String と SecureString

クラスのインスタンスは変更できません System.String 。また、不要になった場合は、プログラムによってガベージコレクションのスケジュールを設定することはできません。つまり、インスタンスは作成後に読み取り専用になり、コンピューターのメモリからインスタンスが削除されるタイミングを予測することはできません。 System.Stringインスタンスは不変であるため、既存のインスタンスを変更するように見える操作は、実際にはそのコピーを作成して操作します。 その結果、 String オブジェクトにパスワード、クレジットカード番号、個人データなどの機密情報が含まれている場合、アプリケーションはコンピューターのメモリからデータを削除できないため、使用後に情報が漏洩するリスクがあります。

オブジェクトは、 SecureString テキスト値を持つオブジェクトに似てい String ます。 ただし、オブジェクトの値 SecureString はメモリに固定されており、基になるオペレーティングシステムによって提供される暗号化などの保護メカニズムを使用する場合があります。また、アプリケーションが読み取り専用としてマークするまで変更できます。また、アプリケーションがメソッドを呼び出しても、 Dispose .NET Framework のガベージコレクターでもコンピューターメモリから削除できます。

クラスの制限事項の詳細につい SecureString ては、「 How to Secure is SecureString? 」セクションを参照してください。

ページのトップへ

SecureString 操作

クラスには SecureString 、次の操作を実行できるメンバーが含まれています。

オブジェクトのインスタンス化 SecureString
オブジェクトをインスタンス化するには、 SecureString パラメーターなしのコンストラクターを呼び出します。

オブジェクトへの文字の追加 SecureString
SecureStringオブジェクトに AppendChar は、メソッドまたはメソッドを呼び出すことによって、一度に1つの文字を追加でき InsertAt ます。

重要

SecureStringオブジェクトをから構築することはできません String 。これは、機微なデータが、変更できないクラスのメモリの永続化によって既に影響を受けるためです String 。 オブジェクトを構築する最善の方法 SecureString は、メソッドなど、1回限りのアンマネージソースからです Console.ReadKey

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

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

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

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

クラスには SecureString 、の値を検査、比較、または変換するメンバーがありません SecureString 。 このようなメンバーがないため、インスタンスの値が誤って、または意図的に公開されることを未然に防ぐことができます。 クラスの適切なメンバー System.Runtime.InteropServices.Marshal (メソッドなど) を使用して、 SecureStringToBSTR オブジェクトの値を操作し SecureString ます。

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

  • 構造体を使用する ProcessStartInfo か、 Process.Start 型のパラメーターを持つメソッドのオーバーロードを呼び出すことによって、プロセスにパスワード情報を提供する場合は SecureString

  • NetworkCredential型のパラメーターを持つクラスコンストラクターを呼び出すことによって SecureString 、またはプロパティを使用して、ネットワークパスワード情報を提供する場合は NetworkCredential.SecurePassword

  • コンストラクターを呼び出すか、プロパティの値を取得することによって SQL Server 認証のパスワード情報を提供する場合 SqlCredential.SqlCredentialSqlCredential.Password

  • アンマネージコードに文字列を渡す場合は。 詳細については、「 SecureString and interop 」セクションを参照してください。

ページのトップへ

SecureString と相互運用

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

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

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

ページのトップへ

SecureString はどのようにセキュリティで保護されていますか。

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

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

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

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

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

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

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

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

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

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

ページのトップへ

コンストラクター

SecureString()

SecureString クラスの新しいインスタンスを初期化します。

SecureString(Char*, Int32)

Char オブジェクトのサブ配列から SecureString クラスの新しいインスタンスを初期化します。

このコンストラクターは、CLS 準拠ではありません。 CLS 準拠の代わりとして SecureString() を使用できます。

プロパティ

Length

現在のセキュリティ文字列内の文字数を取得します。

メソッド

AppendChar(Char)

現在のセキュリティ文字列の末尾に、文字を 1 つ追加します。

Clear()

現在のセキュリティ文字列の値を削除します。

Copy()

現在のセキュリティ文字列のコピーを作成します。

Dispose()

現在の SecureString オブジェクトによって使用されているすべてのリソースを解放します。

Equals(Object)

指定されたオブジェクトが現在のオブジェクトと等しいかどうかを判断します。

(継承元 Object)
GetHashCode()

既定のハッシュ関数として機能します。

(継承元 Object)
GetType()

現在のインスタンスの Type を取得します。

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

このセキュリティ文字列の指定したインデックス位置に文字を挿入します。

IsReadOnly()

このセキュリティ文字列が読み取り専用としてマークされているかどうかを示します。

MakeReadOnly()

このセキュリティ文字列のテキスト値を読み取り専用にします。

MemberwiseClone()

現在の Object の簡易コピーを作成します。

(継承元 Object)
RemoveAt(Int32)

このセキュリティ文字列の指定されたインデックス位置にある文字を削除します。

SetAt(Int32, Char)

指定されたインデックス位置にある既存の文字を別の文字に置き換えます。

ToString()

現在のオブジェクトを表す文字列を返します。

(継承元 Object)

適用対象

こちらもご覧ください