我有个设计问题。我有一个web应用程序,它使用.NET加密API加密/解密数据。(应用程序使用MD5和SHA-1等古老的密码算法)。此外,应用程序对生产代码中的加密密钥进行硬编码。
我想:1)将现有的旧算法(MD5和SHA-1)更新为新的算法。2)将加密密钥从源代码移动到安全共享。3)能方便、有规律地修改加密密钥。
我的设计;
算法更新算法进行算法更新,我们使用具体的.NET实现加密算法。我们使用像MD5CryptoProvider或RijndaelManaged这样的类。这些都是硬编码的。我将删除特定的算法依赖,并使它更灵活,如;
HashAlgorithm.Create(MyPreferredHash.ToString());algo.ComputeHash(.);
MyPreferredHash值将从配置文件中加载,以便我们可以在需要时更改此值。
问:升级代码很容易做到这一点。然而,您是否看到了改变密码算法的潜在问题?我们不会在任何地方存储任何加密或散列数据,并且web应用程序是无状态的。所有哈希值都生成并附加到url字符串中,并从另一个页面解密。因此,不存储任何数据。除了饼干。当我们加密cookie并将其发送回用户时,当服务器接收到它时,我们会解密它。在这种情况下,我想销毁cookie,并发送一个新的客户端。这合理吗?还有什么其他的问题吗?
密钥管理
第二部分的设计,是从源代码中删除硬编码密钥,以保证共享安全.在此之后,我需要能够推出新的加密密钥。每个加密密钥都将与过期日期相关联。当我们推出新的加密密钥时,新密钥将用于加密和解密。如果它无法解密,那么我们可以尝试旧密钥。旧密钥将用于解密或验证,直到其过期为止。过了期限,他们就该退休了。
对于存储,我正在考虑将加密密钥存储在本地机器中的配置文件中,作为主密钥“加密”,该主密钥将驻留在安全共享中。因此,任何无法访问此安全共享的人都将无法看到主密钥。当机器重新启动时,主密钥将从安全共享加载到机器注册表。本地机器中的加密密钥将从配置文件(本地)加载,并由注册表中的主密钥解密。
这种存储选择将使我们只在一个安全共享中存储一个主密钥,以及对加密密钥的历史更改,因为我们将它们存储在版本控制系统中。
最具挑战性的部分是关键的变更/更新。
对于分布式web应用程序,这里推荐的密钥更改算法是什么?如果我们在发布后进行部分部署,并不是所有的机器都有相同的配置文件内容(例如,添加了新的加密密钥)。所有现场部署可能需要1-2周。这也是另一个值得关注的问题,如果我们应该等待所有部署完成,那么这些密钥就会在此之后处于活动状态。
还有其他反馈吗?
发布于 2014-08-05 17:54:26
在未来对特定加密算法的未知攻击面前,设计您的应用程序是非常正确的。
用一种健壮的方式来验证你的应用程序,最简单的方法似乎是为你的加密信息使用一种标准的数据格式,并使用一个标准库来完成这一任务。具体标准的选择将取决于您使用的是哪种数据格式,但也有很好的人选可供选择。然后,当将来发生攻击时,您只需更改一些参数,或更新到最新版本的实现。
做密码是很棘手的。最好由专家来决定。
https://stackoverflow.com/questions/21424227
复制相似问题