我们的应用在<machineKey>
中设置了web.config
:
<machineKey validation="HMACSHA256" validationKey="some-validationkey" decryption="AES" decryptionKey="some-decryption-key" />
它用于加密/解密ASP.NET内置的许多内容,包括:
如果机器密钥被泄露,则意味着攻击者可以解密所有这些内容。一个security best-practice is to rotate your keys often(或至少当你认为它可能被泄露时)。这需要能够对每段加密数据进行版本化,以便在需要时进行旋转。
如果更改计算机密钥并重新部署站点,则具有加密数据的现有用户(例如Cookie,表单字段)很可能会在下一个请求中触发异常,因为无法再解密数据。例如,AnonymousIdentificationModule
会抛出CryptographicException: Error occurred during a cryptographic operation.
。如果AnonymousIdentificationModule
无法对加密/解密进行版本化,则完全可以理解。
我正在考虑使用的一种方法是实现自定义HashAlgorithm
和SymmetricAlgorithm
,内置版本控制以委托实际算法。例如:
使用CryptoConfig.AddAlgorithm()
注册:
CryptoConfig.AddAlgorithm(typeof(MyCustomHashAlgorithm), "MyCustomHashAlgorithm");
CryptoConfig.AddAlgorithm(typeof(MyCustomSymmetricAlgorithm), "MyCustomSymmetricAlgorithm");
更改<machineKey>
以使用自定义算法:
<machineKey validation="alg:MyCustomHashAlgorithm" validationKey="some-validationkey" decryption="alg:MyCustom" decryptionKey="some-decryption-key" />
但是,我担心实施HashAlgorithm
和SymmetricAlgorithm
。我不想意外地引入安全漏洞,这是一个容易做到这一点的地方。此外,这感觉就像一个巨大的黑客,因为它真的属于使用算法的地方(我认为)。
另一种方法是重新实现使用机器密钥但添加版本控制的所有功能。无法更改现有的.NET类。
你如何在生产中处理这个问题?我知道StackOverflow是用ASP.NET MVC编写的,那么他们如何处理呢?
附注:出于安全原因,我们实际上直接将<machineKey>
存储在web.config中(它不在源代码管理中)。
答案 0 :(得分:0)
一个想法是从您所在的州政府,信用合作社,美国国税局(IRS)等那里上一堂课,并安排好停机时间。在应用程序关闭时更改密钥。午夜可能只有五分钟。
现在,您无需编写自定义的加密逻辑,而是编写逻辑来通知用户即将发生的停机并优雅地结束其会话,这是一个更加安全的任务。