我有一个设计问题。我有一个使用.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周。这也是另一个问题,如果我们应该等待所有部署完成,以便这些密钥在那之后生效。
其他意见吗?