密码敏捷性和密钥管理

时间:2014-01-29 06:59:21

标签: cryptography key key-management

我有一个设计问题。我有一个使用.NET加密API来加密/解密数据的Web应用程序。 (App使用旧的加密算法,如MD5和SHA-1)。此外,应用程序硬编码生产代码中的加密密钥。

我想; 1)将现有的旧算法(MD5和SHA-1)更新为新算法。 2)将加密密钥从源代码移动到安全共享。 3)可以轻松定期更改加密密钥

我的设计;

算法更新 对于算法更新,我们使用加密算法的特定.NET实现。我们使用像MD5CryptoProvider或RijndaelManaged这样的类。这些都是硬编码的。我将删除特定的算法依赖,并使其更加敏捷,像;

HashAlgorithm algo = HashAlgorithm.Create(MyPreferredHash.ToString()); algo.ComputeHash(...);

MyPreferredHash值将从配置文件加载,以便我们可以在需要时更改此内容。

问题:升级代码很容易做到这一点。但是,您是否看到更改加密算法的任何潜在问题?我们不会在任何地方存储任何加密或哈希数据,并且Web应用程序是无状态的。生成所有哈希值并将其附加到url字符串并从其他页面解密。因此,不存储任何数据。饼干除外。当我们加密cookie并将其发送回用户时,我们会在服务器收到它时对其进行解密。在这种情况下,我想破坏cookie并向客户端发送一个新cookie。这合理吗?你想到的任何其他问题?

密钥管理

设计的第二部分是从源代码中删除硬编码密钥以保护共享。在此之后,我需要能够推出新的加密密钥。每个加密密钥都将与过期日期相关联。当我们推出新的加密密钥时,新密钥将用于加密和解密。如果它无法解密,那么我们可以尝试旧密钥。旧密钥将用于解密或验证,直到其过期日期。当他们过期时,他们应该退休。

用于存储;我正在考虑将加密密钥存储在本地计算机的配置文件中,由主密钥“加密”,该密钥将驻留在安全共享中。因此,任何无权访问此安全共享的人都将无法看到主密钥。当机器重新启动时,主密钥将从安全共享加载到机器注册表。本地计算机中的加密密钥将从配置文件(本地)加载,并由注册表中的主密钥解密。

此存储选择将使我们只在安全共享中存储一个主密钥,并且还会对加密密钥进行历史更改,因为我们会将它们存储在版本控制系统中。

具有挑战性的部分是关键变更/更新。

此处针对分布式Web应用程序推荐的密钥更改算法是什么?如果我们在发布后进行部分部署,则并非所有计算机都具有相同的配置文件内容(例如,添加了新的加密密钥)。所有站点部署可能需要1-2周。这也是另一个问题,如果我们应该等待所有部署完成,以便在此之后这些密钥将处于活动状态。

还有其他反馈吗?

1 个答案:

答案 0 :(得分:0)

面对未来对特定加密算法的未知攻击,您可以将应用程序设计为敏捷。

以稳健的方式为您的应用提供面向未来的最简单方法似乎是切换到使用标准数据格式加密信息,并使用标准库来进行硬提升。选择使用的特定标准取决于您使用的数据格式类型,但有很多候选人可供选择。然后,当有未来的攻击时,您可以只更改一些参数,或更新到最新版本的实现。

加密是非常棘手的。最好留给专家。