c# - .Net 4.5.2 升级后尝试解密数据时出现 HttpException

标签 c# .net encryption machinekey httpexception

我有一个 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 ,但我有一个现有系统,此时无法更改它。)

更新

只有当 key 是自动生成时才会出现问题。如果我给它们明确的值,升级后一切都会继续正常工作。

最佳答案

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

关于c# - .Net 4.5.2 升级后尝试解密数据时出现 HttpException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25733348/

相关文章:

c# - 尝试使用 Python 从工作 C# 代码生成 RSA 签名

c# - 第三方应用程序无法读取新创建的 .text 文件中的数据

c# - 在单击Gridview行时,更新另一个控件

.net - 使用 NLog 记录方法名称和参数

c# - 不确定如何将 C# 加密函数移植到 PHP

python - Cocoa (Obj-C) 中使用大数的 Mod 函数

c# - UI线程如何知道另一个线程上的数据?

c# - 使用 MEF 和 VSIX 创建 Visual Studio 项目系统

.net - 如何强制 NLog 覆盖日志文件

c# - CodeDom 编译器 : Type or namespace 'Foo' does not exist in the namespace 'System'