我们的应用程序具有
以下内容web.config
:
它用于加密/解密ASP.NET内置的许多东西,包括:
表单验证票证
匿名识别模块门票
防伪标记(在ASP.NET MVC中)
如果机器密钥被泄露,则意味着攻击者可以解密所有这些内容.一个安全的最佳实践是经常转动钥匙(或者至少当你认为它可能会受到损害).这将需要能够对每段加密数据进行版本化,以便在需要时进行旋转.
如果更改计算机密钥并重新部署站点,则具有加密数据的现有用户(例如cookie,表单字段)很可能会在下一个请求中触发异常,因为数据无法再解密.例如,AnonymousIdentificationModule
将抛出一个CryptographicException: Error occurred during a cryptographic operation.
.如果AnonymousIdentificationModule
没有版本加密/解密的能力,这就完全有道理.
我正在考虑使用的一种方法是实现自定义HashAlgorithm
和SymmetricAlgorithm
内置版本控制以委托实际算法.例如:
将它们注册为CryptoConfig.AddAlgorithm()
:
CryptoConfig.AddAlgorithm(typeof(MyCustomHashAlgorithm), "MyCustomHashAlgorithm"); CryptoConfig.AddAlgorithm(typeof(MyCustomSymmetricAlgorithm), "MyCustomSymmetricAlgorithm");
更改
以使用自定义算法:
但是,我很关心实现HashAlgorithm
和SymmetricAlgorithm
.我不想意外地引入安全漏洞,这是一个容易做到这一点的地方.此外,这感觉就像一个巨大的黑客,因为它真的属于使用该算法的地方(我认为).
另一种方法是重新实现使用机器密钥但添加版本控制的所有功能.无法更改现有的.NET类.
你如何在生产中处理这个问题?我知道StackOverflow是用ASP.NET MVC编写的,那么他们如何处理呢?
附注:出于安全原因,我们实际上并不
直接在web.config中存储它(它在源代码控制之外).