我需要从本地数据库存储和检索敏感数据-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时,为什么看起来好像被改变了? 最佳答案
虽然我不知道为什么会这样,但我将代码更改为使用AES加密-可以正常工作。
虽然不能说出问题的答案,但我认为这是一个有效的解决方法,值得一提。
编辑:
我想我已经找到了导致问题的原因(我仍然不完全知道为什么会这样,但是今天我确实注意到了一些事情)。
如果Web应用程序正在使用ApplicationPool标识,则一切正常,并且在IISRESET之后DPAPI应该继续工作。但是,如果我将身份更改为AD中定义的特定用户,则在回收应用程序池后事情就变得一团糟。
对我来说很幸运,在这种特殊情况下,我不再需要特定的AD用户,并且主要加密基于AES(当负载平衡成为问题时,DPAPI不能用于访问共享资源),而DPAPI仅用于加密AES密钥的本地副本。
关于c# - IIS应用程序上的ProtectedData.Unprotect-IISRESET后无法工作,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20998290/