我有一个设计问题。我有一个使用 .NET 加密 API 来加密/解密数据的 Web 应用程序。(应用程序使用旧的加密算法,如 MD5 和 SHA-1)。此外,应用程序对生产代码中的加密密钥进行硬编码。
我想; 1 ) 将现有的旧算法(MD5 和 SHA-1)更新为新算法。2 ) 将加密密钥从源代码移动到安全共享。3 ) 可以轻松定期更改加密密钥
我的设计;
算法更新 对于算法更新,我们使用加密算法的特定 .NET 实现。我们使用像 MD5CryptoProvider 或 RijndaelManaged 这样的类。这些都是硬编码的。我将删除特定的算法依赖并使其更敏捷;
HashAlgorithm 算法 = HashAlgorithm.Create(MyPreferredHash.ToString()); 算法.ComputeHash(...);
MyPreferredHash 值将从配置文件中加载,以便我们可以在需要时更改它。
问题:升级代码很容易做到这一点。但是,您是否看到更改加密算法的任何潜在问题?我们不会在任何地方存储任何加密或散列数据,并且 Web 应用程序是无状态的。所有的哈希值都被生成并附加到 url 字符串并从其他页面解密。因此,不存储任何数据。除了饼干。当我们加密cookie并将其发送回用户时,我们会在服务器接收到它时对其进行解密。在这种情况下,我想销毁 cookie 并向客户端发送一个新的。这合理吗?你想到的还有其他问题吗?
密钥管理
设计的第二部分是从源代码中删除硬编码密钥以安全共享。在此之后,我需要能够推出新的加密密钥。每个加密密钥都将与过期日期相关联。当我们推出新的加密密钥时,新密钥将用于加密和解密。如果它无法解密,那么我们可以尝试旧密钥。旧密钥将用于解密或验证,直到其到期日期为止。当他们超过到期日时,他们应该退休。
用于存储;我正在考虑将加密密钥存储在本地计算机的配置文件中,由将驻留在安全共享中的主密钥“加密”。因此,无权访问此安全共享的任何人都无法看到主密钥。当机器重新启动时,主密钥将从安全共享加载到机器注册表。本地机器中的加密密钥将从配置文件(本地)加载并由注册表中的主密钥解密。
这种存储选择将使我们仅将一个主密钥存储在安全共享中,以及加密密钥的历史更改,因为我们将它们存储在版本控制系统中。
具有挑战性的部分是关键更改/更新。
对于分布式 Web 应用程序,这里推荐的密钥更改算法是什么?如果我们在发布后进行部分部署,则并非所有机器都具有相同的配置文件内容(例如,添加了新的加密密钥)。所有站点部署可能需要 1-2 周。这也是另一个问题,如果我们应该等待所有部署完成,以便之后这些密钥将处于活动状态。
还有别的反馈吗?