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 することをお勧めしません。 詳細については、「SecureString を使用しない」を参照GitHub。

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 、.NET Framework ガベージ コレクターによってコンピューター のメモリから削除したりすることもできます。 Dispose

クラスの制限事項の詳細については SecureString 、「SecureString の安全性」 セクションを参照 してください。

ページのトップへ

SecureString 操作

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

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

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

重要

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

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

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

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

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

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

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

ページのトップへ

SecureString と相互運用

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

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

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

ページのトップへ

SecureString のセキュリティはどのくらいですか?

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

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

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

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

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

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

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

インスタンスの値が公開される時間間隔は、 クラスと比較して 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)

適用対象

こちらもご覧ください