2

我需要从本地数据库中存储和检索敏感数据 - 此数据由 Web 应用程序使用。

为了保护上述数据,我选择使用ProtectedData该类。

IIS 应用程序正在使用特定的 AD 用户(高级设置中的身份属性)运行。

在我执行 IISRESET 之前,一切正常 - 在这一点上,似乎为了ProtectedData课程的目的而更改了身份,并且我留下了无法解密的数据 - 我遇到了一个Key not valid for use in specified state异常。

这是我正在使用的代码:

    static public string Encrypt(string data)
    {
        var encryptedData = ProtectedData.Protect(System.Text.Encoding.UTF8.GetBytes(data), entropy, DataProtectionScope.CurrentUser);
        return Convert.ToBase64String(encryptedData);
    }

    static public string Decrypt(string base64string)
    {
        var encryptedData = Convert.FromBase64String(base64string);
        return System.Text.Encoding.UTF8.GetString(ProtectedData.Unprotect(encryptedData, entropy, DataProtectionScope.CurrentUser));
    }

entropy对于我的应用程序来说显然是静态的。

这是怎么回事?DataProtectionScope.CurrentUser顾名思义,我的印象是将使用当前用户——据我所知,这应该是应用程序池标识。为什么在我执行 IISRESET 时这似乎发生了变化?

4

2 回答 2

0

虽然我不知道为什么会发生这种情况,但我将代码更改为使用 AES 加密 - 这工作正常。

虽然不是每个问题的答案,但我认为这是一个值得一提的有效解决方法。

编辑

我想我已经找到了导致问题的原因(我仍然不完全知道为什么会发生这种情况,但我今天确实注意到了一些事情)。

如果 Web 应用程序正在使用ApplicationPool标识,那么一切都很好,DPAPI 应该在 IISRESET 之后继续工作。但是,如果我将身份更改为 AD 中定义的特定用户,那么在应用程序池被回收后事情就会变得混乱。

幸运的是,在这种特殊情况下,我不再需要特定的 AD 用户,并且主要加密基于 AES(当负载平衡进入等式时,DPAPI 不能用于访问共享资源),DPAPI 仅用于加密 AES 密钥的本地副本。

于 2014-01-15T07:38:44.937 回答
0

我在使用 ASP.NET Core 数据保护 API 时遇到了确切的错误,对于遇到此错误的人,请确认已为应用程序池用户启用了 LoadUserProfile。

于 2016-09-06T09:52:39.010 回答