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 を使用しないでください 」を参照してください。

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

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

重要

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

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

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

String と SecureString
SecureString 操作
SecureString と相互運用
SecureString のセキュリティはどのくらいですか?

String と SecureString の比較

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

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

クラスの制限 SecureString 事項については、「 SecureString のセキュリティ 保護方法」セクションを参照してください。

ページのトップへ

SecureString 操作

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

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

オブジェクトに文字を SecureString 追加する
オブジェクトに一度に 1 文字を追加するには、 SecureString メソッドまたは InsertAt メソッドをAppendChar呼び出します。

重要

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

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

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

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

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

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

.NET Framework クラス ライブラリでは、通常、次の方法でインスタンスが使用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 のセキュリティはどのくらいですか?

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

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

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

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

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

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

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

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

ストレージと使用量
より一般的には、 クラスは 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)

適用対象

こちらもご覧ください