2

認証トークン (英数字) を保存および回復するためのこのコードがあります。

public static void Store (string token)
{
    byte[] buffer = Encoding.UTF8.GetBytes (token.PadRight (32));
    ProtectedMemory.Protect (buffer, MemoryProtectionScope.SameLogon);
    Settings.Default.UserToken = buffer.ToHexString ();
    Settings.Default.Save ();
}

public static string Retrieve ()
{
    byte[] buffer = Settings.Default.UserToken.FromHexString ();
    if (buffer.Length == 0)
        return String.Empty;
    ProtectedMemory.Unprotect (buffer, MemoryProtectionScope.SameLogon);
    return Encoding.UTF8.GetString (buffer).Trim ();
}

そして、ほとんど問題なく動作しますが、ガベージが出る場合があります(多くのFDバイトと読み取り可能なバイトがいくつかあります)。これは再起動したときにのみ発生すると思われますが、再現するのに苦労しました。

これは意図した動作ですか?つまり、MemoryProtectionScope.SameLogon再起動時にデータが常に読み取れないということですか? 私は何か間違ったことをしていますか?

FromHexStringおよびメソッドは、ToHexString期待どおりの動作をします。

4

1 に答える 1

4

はい、ProtectedMemory再起動後は常に失敗します(または、別MemoryProtectionScopeの s の場合は、プロセスを再起動するなど)。ストレージ用のデータではなく、メモリを保護するためにのみ機能することを意図しています。

ProtectedData代わりに使用したい:

ProtectedData.Protect(buffer, null, DataProtectionScope.CurrentUser);

これらはどちらも DPAPI (Windows 2000 で導入) のマネージ ラッパーです。詳細については、.NET セキュリティ ブログ ( http://blogs.msdn.com/b/shawnfa/archive/2004/05/05/126825.aspx ) に多数の投稿があります。

于 2014-10-23T09:19:01.213 に答える