CryptographicException - 无法更新密码

Posted

技术标签:

【中文标题】CryptographicException - 无法更新密码【英文标题】:CryptographicException - Unable to update the password 【发布时间】:2013-11-25 06:49:34 【问题描述】:

我有一些想要保护的数据,所以我使用ProtectedData 将其加密到一个文件中。 当我尝试读取和解密数据时,我遇到了最奇怪的异常:

。为新密码提供的值不符合域的长度、复杂性或历史要求。

这是它被抛出的地方:

byte[] decryptedData = ProtectedData.Unprotect(Encoding.UTF8.GetBytes(fileContent),
 Encoding.UTF8.GetBytes(entropy),
 DataProtectionScope.LocalMachine);

使用DataProtectionScope.CurrentUser时也会发生这种情况。

我没有在网上找到有关此异常的任何信息,所以我几乎一无所知。

【问题讨论】:

【参考方案1】:

一些通用错误不会产生异常,并且会抛出最后一个错误。

从 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;
    

【讨论】:

以上是关于CryptographicException - 无法更新密码的主要内容,如果未能解决你的问题,请参考以下文章

CryptographicException异常处理方法

CryptographicException异常处理方法

使用证书部署出现System.Security.Cryptography.CryptographicException 错误解决方案

System.Security.Cryptography.CryptographicException:密钥集不存在

PushSharp 抛出 CryptographicException:证书实例为空

CryptographicException 未处理:系统找不到指定的文件