我有一些我希望保护的数据,因此我使用ProtectedData
将其加密到文件中。
当我试图读取和解密数据时,我得到了最奇怪的例外:
CryptographicException - 无法更新密码。为新密码提供的值不符合域的长度,复杂性或历史记录要求。
这是抛出它的地方:
byte[] decryptedData = ProtectedData.Unprotect(Encoding.UTF8.GetBytes(fileContent),
Encoding.UTF8.GetBytes(entropy),
DataProtectionScope.LocalMachine);
使用DataProtectionScope.CurrentUser
时也会发生这种情况。
我没有在网上找到任何有关此例外的信息,所以我几乎一无所知。
答案 0 :(得分:0)
某些通用错误不会生成异常,并且会抛出最后一个错误。
来自System.Security.Cryptography.ProtectedDate.Unprotect:
throw new CryptographicException(Marshal.GetLastWin32Error());
更具体地说,它最像是失败,因为使用System.Security.Cryptography实现crypt32.dll的默认标志:CryptUnprotectData - CRYPTPROTECT_UI_FORBIDDEN - “此标志用于呈现用户界面(UI)的远程情况设置此标志并为保护或取消保护指定UI时,调用失败,GetLastError()返回ERROR_PASSWORD_RESTRICTION状态代码。“ Windows Data Protection
我发现一个对我有用的解决方法是不使用Base64转换器,我使用的是PowerShell使用的相同脚本:
static byte[] ByteArrayFromString(string s)
{
int length = s.Length / 2;
byte[] numArray = new byte[length];
if (s.Length > 0)
{
for (int i = 0; i < length; i++)
{
numArray[i] = byte.Parse(s.Substring(2 * i, 2), NumberStyles.AllowHexSpecifier, CultureInfo.InvariantCulture);
}
}
return numArray;
}