我有一个客户端想要在ASP.NET Web窗体应用程序中打开ViewState加密。由于符合FIPS标准,他们无法使用默认算法。客户端的初始请求是使用如下的3DES / AES,我将其添加到web.config文件中:
<machineKey validationKey="..." decryptionKey="..." validation="3DES" decryption="AES" />
进入此配置会导致应用程序停止使用以下错误:
[HttpException (0x80004005): Unable to validate data.]
System.Web.Configuration.MachineKeySection.EncryptOrDecryptData(Boolean fEncrypt, Byte[] buf, Byte[] modifier, Int32 start, Int32 length, Boolean useValidationSymAlgo, Boolean useLegacyMode, IVType ivType, Boolean signData) +1090
System.Web.UI.Page.EncryptString(String s, Purpose purpose) +150
[...]
通过将两个键切换到3DES,我能够让系统正常工作。
为什么在使用两种不同的算法时系统会失败?
答案 0 :(得分:4)
不太确定为什么会失败 - 或许提供了密钥长度的一些错误?内部异常应该能够告诉你更多是否存在。
无论如何,您应该知道NIST正逐步淘汰3DES,并且ASP.NET不会以符合FIPS的方式使用3DES。 (参考:http://csrc.nist.gov/publications/nistpubs/800-67-Rev1/SP-800-67-Rev1.pdf。特别参见前言,该前言表明我们处于过渡期,客户可以从3DES转移到AES。另请参阅第3.5节; ASP.NET不限制块密码算法的调用次数,因此我们对该算法的特殊使用使其不符合FIPS标准。)
最佳方案是使用AES进行加密/解密,使用HMACSHA256进行验证。这种组合符合FIPS标准,并提供比3DES / SHA1更好的安全性(这是之前使用的)。为此,请设置:
<machineKey validation="HMACSHA256" validationKey="256 bits worth of hex digits (64 hex chars)" decryption="AES" decryptionKey="256 bits worth of hex digits (64 hex chars)" />
然后在Web.config中设置<pages viewStateEncryptionMode="Always" />
,告诉ASP.NET使用您在<machineKey>
元素中提供的算法使用视图状态加密。