【问题标题】:HttpException when trying to decrypt data after .Net 4.5.2 upgrade.Net 4.5.2 升级后尝试解密数据时出现 HttpException
【发布时间】:2014-11-02 05:01:23
【问题描述】:

我有一个 REST 服务 (C#/IIS),其中少量数据使用以下方法加密:

var encryptedText = MachineKey.Encode(bytes, MachineKeyProtection.All)

加密的字符串稍后会发布(到 REST 服务)并使用以下方法解码:

MachineKey.Decode(encryptedText, MachineKeyProtection.All)

MachineKey 是自动生成的,如 web.config 所示:

    <machineKey
        decryption="AES"
        decryptionKey="AutoGenerate"
        validation="AES"
        validationKey="AutoGenerate" />

系统从.Net 4.5.1升级到4.5.2后,无法再解密升级前加密的字符串;它给出了一个 HttpException“无法验证数据”。 (我可以解密升级后加密的字符串。)

因此,4.5.1 和 4.5.2 之间的算法发生了一些变化,使它们不兼容。我无法在网上找到有关此特定问题的任何信息。有没有人有关于这个问题的具体细节和/或使它工作的解决方法?

如果重要的话,该项目的目标是 .Net 4.0,而不是 4.5 或 4.5.1 或 4.5.2。

(顺便说一句,听起来不建议将 MachineKey.Encode/Decode 用于短期加密以外的任何事情,可能是因为这类问题?另外,我知道现在不推荐使用 Encode/Decode ,但我有一个现有的系统,此时无法更改它。)

更新

仅当键为自动生成时才会出现问题。如果我给他们明确的值,升级后一切都会继续正常工作。

【问题讨论】:

  • 这可能与键的自动生成方式有关。我刚刚尝试了相同的升级,但这次我从decryptionKey 和validationKey 的显式值开始,而不是AutoGenerate。从初步测试来看,升级前的加密数据可以在升级后解密。
  • 很奇怪。我会建议确实使用硬编码的密钥。这可能与 ASP.NET 4.5.2 现在忽略 enableViewStateMac=false 的事实有关吗?检查这个:support.microsoft.com/kb/2915218
  • 这种情况应该仍然有效:这些算法在 4.5 发布后没有改变。您确定在最初生成值时(在对 Encode 的原始调用期间)4.5.1 框架已安装在机器上吗?这些加密值是不是更早地产生了——比如说,从 3 或 4 年前,甚至在 4.5 和 4.5.1 发布之前很久?
  • 感谢您的回复,李维。我可以在我的测试虚拟机上 100% 地重现该问题。最初的 .net 框架是 4.5.1(由msdn.microsoft.com/en-us/library/hh925568.aspx 确定)。我生成加密值。我确认该值可以解密。然后我将 .net 版本更新为 4.5.2。执行所需的重新启动。在此之后,加密值无法解密(但任何新值都可以)。我对开发团队的建议是在安装期间生成 MachineKey 密钥,而不是使用 AutoGenerate。但如果您想了解更多详情,请告诉我。
  • 安装 .net 4.6 时出现同样的问题。

标签: c# .net encryption machinekey httpexception


【解决方案1】:

我注意到的一件事是在 IIS 应用程序池中加载用户配置文件设置。如果您为 IIS 6 兼容性禁用它,则 MachineKey.Decode 每次应用程序池回收时都无法解密数据。对于我自己的测试,似乎只有过时的编码/解码方法会受到影响,使用 MachineKeyProtection.All 时也会受到影响。它们与 MachineKeyProtection.Encryption 配合得很好。

【讨论】:

    猜你喜欢
    • 2019-12-22
    • 1970-01-01
    • 2016-03-02
    • 1970-01-01
    • 1970-01-01
    • 2018-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多