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意味着重新启动后数据将始终不可读?难道我做错了什么?

FromHexStringandToHexString方法完全符合您对它们的期望。

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 回答