2014-01-29 88 views
0

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

我想; 1)将现有的旧算法(MD5和SHA-1)更新为新的算法。 2)将加密密钥从源代码移至安全共享。 3)可以方便地更换加密密钥

我的设计;

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

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

MyPreferredHash值将从配置文件中加载,以便我们可以在需要时进行更改。

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

密钥管理设计的

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

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

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

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

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

其他意见吗?

回答

0

你要设计你的应用程序将在未来对特定的加密算法未知的攻击面前敏捷完全正确。

面向未来的最简单的方法你在一个坚固的方式应用似乎是切换到使用标准数据格式的加密信息,并使用标准库去进行艰苦的提升。具体的标准使用将取决于什么样的,你正在使用的数据格式的选择,但也有很好的候选人可供选择。然后,当有未来的攻击时,您可以更改一些参数,或更新到最新版本的实施。

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