0

C# コンソール アプリの場合、アプリケーション設定でパスワードを保持する必要がありますが、typeSystem.Security.SecureStringの設定を作成すると、設定自体がプレーンテキストの構成ファイルから削除されます。もう生の値を見ることができないので、保存時にデータがまだ暗号化されているかどうかを検証できません。

文字列を単純に暗号化するSecureStringのに最適な方法ですか、それとも使用する必要がありますか?ProtectedData

SecureString--編集-- aを永続化できることを検証するために使用したテスト コードを次に示します。

        [global::System.Configuration.ApplicationScopedSettingAttribute()]
        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
        public global::System.Security.SecureString Password
        {
            get
            {
                return ((global::System.Security.SecureString)(this["Password"]));
            }
            set { this["Password"] = value; }
        }

        static void Main(string[] args)
        {
            PersistPassword("A-Test-Password");
            Console.WriteLine(ReadPassword());
            Console.ReadLine();
        }

        static void PersistPassword(string Password)
        {
            SecureString ss = new SecureString();
            Password.ToCharArray().ToList().ForEach(ss.AppendChar);
            Settings.Default.Password = ss;
        }

        static string ReadPassword()
        {
            SecureString ss = Settings.Default.Password;
            IntPtr ptr = Marshal.SecureStringToCoTaskMemUnicode(ss);
            return Marshal.PtrToStringUni(ptr);
        }
4

2 に答える 2

1

MSDNの状態として、

SecureString のインスタンスの値は、インスタンスの初期化時または値の変更時に、基になるプラットフォームでサポートされているメカニズムを使用して自動的に保護されます。

パスワードがセキュアストリングに保存されたら、それを読み取り専用に保つメカニズムを提供したい場合は、そのメソッドを呼び出すことができますMarkAsReadonly()

永続化のために、ハッシュしSecureStringてソルトを作成することもできます。比較目的など、後で使用するためにソルトを取得できます。ソルト オーバーを使用しているこのコード スニペットを確認してくださいSecurestring

于 2015-09-04T19:20:41.947 に答える
1

SecureStringで暗号化されたデータを永続化することはできません。キーはメモリに保持され、プログラムが実行されている間だけ存続します。SecureString は、ネイティブのCryptProtectMemory関数のラッパーです。

暗号化されたデータを (プログラムが存在するよりも長く) 永続化できるようにする必要がある場合は、データ保護 API (DPAPI)が必要です。これは、 ProtectedDataクラスを通じて C# ユーザーに公開されるCryptProtectData関数です。

SecureStringには、一時的であるという利点があります。次の場合に役立ちます。

  • パスワード
  • クレジットカード番号
  • 社会保険番号

それらがプログラムによって使用されている間 - その後削除されます。

DPAPI は長期保存に適しています。ただし、保護レベルに注意して、必要なものに適したものを選択してください。

  • 私だけが解読可能
  • このPCでのみ復号可能
  • ドメイン内の誰でも解読可能

別のサイトまたは別のドメインへの転送に耐えられる暗号化が必要な場合: CryptProtectData は適していません。

4 つのレベル

  • CryptProtectMemory (.NET では SecureString): プロセスのメモリ内でのみ有用
  • CryptProtectData (.NET では ProtectedData): データのブロブを暗号化し、好きな場所 (メモリ、レジストリ、ハードディスク) に保存できますが、自分で保存する必要があります。
  • CredWrite: CryptProtectDataを使用してパスワードを暗号化し、Windows Password Vault ([スタート] → [資格情報マネージャー]) に保存します。
  • CredUIPromptForCredentials / CredUIConfirmCredentials : ユーザーにパスワードの入力を求め、暗号化し、 CredWriteを使用してパスワード ボールト (スタート → 資格情報マネージャー) に保存します。
于 2019-01-18T22:27:07.837 に答える