如何安全地旋转机器钥匙?

时间:2017-01-11 17:45:22

标签: c# asp.net .net security web

我们的应用在<machineKey>中设置了web.config

<machineKey validation="HMACSHA256" validationKey="some-validationkey" decryption="AES" decryptionKey="some-decryption-key" />

它用于加密/解密ASP.NET内置的许多内容,包括:

  • 表单身份验证票据
  • 匿名身份识别模块门票
  • 防伪标记(在ASP.NET MVC中)

如果机器密钥被泄露,则意味着攻击者可以解密所有这些内容。一个security best-practice is to rotate your keys often(或至少当你认为它可能被泄露时)。这需要能够对每段加密数据进行版本化,以便在需要时进行旋转。

如果更改计算机密钥并重新部署站点,则具有加密数据的现有用户(例如Cookie,表单字段)很可能会在下一个请求中触发异常,因为无法再解密数据。例如,AnonymousIdentificationModule会抛出CryptographicException: Error occurred during a cryptographic operation.。如果AnonymousIdentificationModule无法对加密/解密进行版本化,则完全可以理解。

我正在考虑使用的一种方法是实现自定义HashAlgorithmSymmetricAlgorithm,内置版本控制以委托实际算法。例如:

  1. 使用CryptoConfig.AddAlgorithm()注册:

    CryptoConfig.AddAlgorithm(typeof(MyCustomHashAlgorithm), "MyCustomHashAlgorithm");
    CryptoConfig.AddAlgorithm(typeof(MyCustomSymmetricAlgorithm), "MyCustomSymmetricAlgorithm");
    
  2. 更改<machineKey>以使用自定义算法:

    <machineKey validation="alg:MyCustomHashAlgorithm" validationKey="some-validationkey" decryption="alg:MyCustom" decryptionKey="some-decryption-key" />
    
  3. 但是,我担心实施HashAlgorithmSymmetricAlgorithm。我不想意外地引入安全漏洞,这是一个容易做到这一点的地方。此外,这感觉就像一个巨大的黑客,因为它真的属于使用算法的地方(我认为)。

    另一种方法是重新实现使用机器密钥但添加版本控制的所有功能。无法更改现有的.NET类。

    你如何在生产中处理这个问题?我知道StackOverflow是用ASP.NET MVC编写的,那么他们如何处理呢?

    附注:出于安全原因,我们实际上直接将<machineKey>存储在web.config中(它不在源代码管理中)。

1 个答案:

答案 0 :(得分:0)

一个想法是从您所在的州政府,信用合作社,美国国税局(IRS)等那里上一堂课,并安排好停机时间。在应用程序关闭时更改密钥。午夜可能只有五分钟。

现在,您无需编写自定义的加密逻辑,而是编写逻辑来通知用户即将发生的停机并优雅地结束其会话,这是一个更加安全的任务。