【发布时间】: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