4

假设我有一个在网络场中运行的 ASP.NET MVC 3 应用程序,其中每个网络服务器都属于一个工作组(与具有共享帐户的域相对)。Web 场也是可自动扩展的,这意味着实例的数量取决于负载。敏感数据在从数据库存储/检索时会被加密和解密。对称和非对称密钥存储在每台机器上,并使用 ACL 进行保护,并使用 DAPI(使用机器密钥)进行加密。

出于合规性和安全性原因,需要定期轮换密钥。您将如何设计/修改系统以定期自动轮换密钥而不使系统脱机?假设有任意数量的表,每个表都有任意数量的列,这些列使用密钥进行加密。

许多问答都与使用哪些算法以及如何保护密钥有关,但很少有人真正解决如何设计和实现允许轮换这些密钥的应用程序,尤其是在共享数据库的动态环境(自动缩放环境)中。

4

2 回答 2

3

系统中有多个密钥

当有多个编码(或加密方案、密钥)时,您通常首先要做的是引入某种版本控制方案,因为您需要知道该特定数据使用了哪个密钥。为此,您有多种选择:

  • 时间戳:保存数据已与数据加密的时间戳。然后将时间划分为使用相同密钥的一定长度的间隔。
  • 版本号:您也可以简单地分配增加的版本号。
  • 密钥指纹:将密钥的指纹与数据一起存储

在任何情况下,您都需要存储当前正在使用的所有密钥,以便能够解密数据。读取数据时,只需查找与您的版本标识符匹配的密钥并解密。写入时,使用当前活动的密钥并存储加密数据+您的版本标识符。当您确定数据库中没有使用此密钥加密的数据时,您可以停用(也称为删除)密钥。

部署新密钥

每当您滚动到新密钥时,都必须生成和部署该密钥。您可以以集中方式执行此操作,也可以使用一些分布式密钥协议协议。

重新加密数据

如果需要重新加密数据,可以通过两种方式进行:

  • 后台进程:有一个后台进程,它只检索具有旧版本标识符的 N 个数据项,解密并重新加密并存储结果。在运行之间睡一会儿,以免系统过载。
  • 访问更新:每当您读取数据并注意到它具有旧版本标识符时,请使用当前密钥重新加密并存储结果。根据您的数据访问模式,这可能不会重新加密所有内容,因此可能需要额外的后台进程。

非对称加密

如果您使用的是非对称加密(我猜例如用于存储信用卡号码,网络服务器只有公钥加密,支付处理器有私钥解密)它会有点棘手,因为只有具有私钥的机器可以重新加密数据。所有其他方面都是一样的。

于 2012-06-19T11:25:16.863 回答
0

Google 的 Keyczar提供了这样一个框架,但没有 .Net 版本。

也许您可以将 C++ 版本包装在 .Net 包装器中?

于 2012-06-19T11:18:42.860 回答