我有一个设计问题。我有一个Web应用程序,该应用程序使用.NET加密API来加密/解密数据。(应用程序使用旧的加密算法,例如MD5和SHA-1)。另外,APP硬编码生产代码中的加密密钥。
我想;1)将现有的旧算法(MD5和SHA-1)更新为新算法。2)将加密密钥从源代码转移到安全共享。3)可以轻松且定期更改加密键
我的设计;
算法更新对于算法更新,我们使用加密算法的特定.NET实现。我们使用MD5Cryptoprovider或Rijndaelman的课程。这些都是硬编码。我将删除特定的算法依赖性,并使其更加敏捷;
hashalgorithm algo = hashalgorithm.create(mypreferredhash.tostring());algo.computehash(...);
mypreferredhash值将从配置文件中加载,以便我们可以在想要的时候更改它。
问题:升级代码很容易执行此操作。但是,您看到更改加密算法的潜在问题吗?我们在任何地方都不会存储任何加密或哈希数据,并且Web应用程序无状态。生成所有哈希值并将其附加到URL字符串中,并从另一页中解密。因此,没有存储数据。除了饼干。当我们加密cookie并将其发送回用户时,我们在服务器接收时解密它。在这种情况下,我想到了销毁饼干并向客户发送新的饼干。这是合理的吗?您想到的还有其他问题吗?
密钥管理
设计的第二部分是从源代码中删除硬编码的密钥以保护共享。之后,我需要能够推出新的加密密钥。每个加密密钥将与到期日期相关联。当我们推出新的加密密钥时,将使用新密钥进行加密和解密。如果没有解密,我们可以尝试旧键。旧密钥将用于解密或验证,直到到期日期为止。当他们通过到期日期时,他们应该退休。
用于存储;我正在考虑将加密密钥存储在本地计算机中的配置文件中,因为主密钥将"加密",该密钥将位于安全共享中。因此,任何无法访问此安全共享的人都将无法看到主密钥。重新启动机器时,将从安全共享到机器注册表加载主键。本地计算机中的加密密钥将从config文件(本地)加载,并由主密钥在注册表中解密。
此存储选择将使我们仅在安全共享中存储一个主密钥,以及对加密密钥的历史更改,因为我们将它们存储在版本控制系统中。
具有挑战性的部分是关键更改/更新。
在这里,用于分布式Web应用程序的推荐密钥更改算法是什么?如果我们在发布后进行部分部署,那么并非所有机器都会具有相同的配置文件内容(例如,添加了新的加密密钥)。所有现场部署都可能需要1-2周。这也是另一个问题,如果我们应该等待所有部署完成,以便这些密钥会在此之后处于活动状态。
还有其他反馈?
您在面对未来对特定加密算法的未来攻击时,设计应用程序是敏捷的。
以可靠的方式使应用程序未来的最简单方法似乎是切换到使用标准数据格式为您的加密信息,并使用标准库来完成努力。选择要使用的特定标准将取决于您正在使用的哪种数据格式,但是有很多候选人可供选择。然后,当有未来的攻击时,您只需更改一些参数,或更新到实现的最新版本。
做加密非常棘手。最好把它留给专家。