鉴于即将出台的 GDPR 法规,我工作的公司正在考虑升级他们的加密算法并加密比以前更多的数据。作为被指定处理此问题的人,我已经用 AES-256 替换了我们旧的 CAST-128 加密(我说加密,但它更像是散列,没有盐,并且每次都产生相同的密文),并编写了工具来迁移数据。但是,加密密钥仍然在应用程序中进行硬编码,并且可以在几分钟内使用反汇编程序提取。
我们的产品是一个桌面应用程序,我们的大多数客户都在内部安装了它。他们中的大多数人还托管自己的数据库。由于他们在本地拥有整个产品,因此保护密钥似乎是一项非常困难的任务。
经过一番研究,我决定采用以下方法。在安装过程中,将为每位客户生成一个随机的 256 位密钥,并用于使用 AES 加密对其数据进行加密。然后,密钥本身将在用户模式下使用 DPAPI 进行加密,其中唯一可以访问数据的用户将是新创建的具有有限权限的锁定域服务帐户,该帐户无法实际登录机器。加密的密钥将存储在注册表的 ACL ed 部分中。然后,加密模块将模拟该用户来执行其功能。
问题是,由于密钥将在安装时随机生成,并立即加密,因此我们也不会拥有它。如果客户碰巧删除了这个帐户,重新安装了服务器操作系统,或者以其他方式设法丢失了密钥,则数据将无法恢复。所以在所有的阐述之后,真正的问题来了:
我正在考虑让客户备份存储密钥的注册表,并假设即使在重新安装或删除用户之后,只要在同一台机器上使用相同的密码创建相同的用户帐户,它就会创建相同的DPAPI 机密并能够解密密钥。但是,我不知道是否是这种情况,因为我不确定这些秘密是如何产生的。谁能确认这是否真的如此?如果您能想到更好的方法,我也愿意接受有关完全不同的密钥存储方法的建议。