DPAPI密钥存储和恢复

时间:2017-11-29 17:18:19

标签: encryption dpapi key-storage

鉴于即将出台的GDPR规定,我所工作的公司正在考虑升级其加密算法并加密比以前更多的数据。作为指定处理此问题的人,我已经用AES-256替换了我们的旧CAST-128加密(我说加密,但它更像是散列,没有盐,并且每次都产生相同的密文)并且编写了工具来迁移数据。但是,加密密钥仍然在应用程序中进行了硬编码,并且可以在几分钟内通过反汇编程序解压缩。

我们的产品是桌面应用程序,我们的大多数客户都在内部安装。他们中的大多数人也在托管他们自己的数据库。由于他们在本地拥有整个产品,因此保护密钥似乎是一项相当困难的任务。

经过一番研究,我决定采用以下方法。在安装过程中,将为每个客户生成一个随机的256位密钥,并用于使用AES加密对其数据进行加密。然后,密钥本身将在用户模式下使用DPAPI进行加密,其中唯一可以访问数据的用户将是新创建的具有有限权限的锁定域服务帐户,无法实际登录到计算机。加密密钥将存储在注册表的ACL编辑部分中。然后,加密模块将模拟该用户执行其功能。

问题在于,密钥将在安装时随机生成,并立即加密,甚至我们都没有。如果客户碰巧删除了此帐户,重新安装服务器操作系统,或设法以其他方式丢失密钥,则数据将无法恢复。因此,经过所有的阐述,这里出现了实际的问题:

我正在考虑让客户备份存储密钥的注册表,并假设即使重新安装或删除用户,只要在同一台计算机上使用相同的密码创建相同的用户帐户,它就会创建相同的DPAPI秘密并能够解密密钥。但是,我不知道是否是这种情况,因为我不确定这些秘密是如何产生的。任何人都可以确认这是否真的如此?如果您能想到一个更好的密钥存储方法,我也会接受建议。

1 个答案:

答案 0 :(得分:1)

我没有看到与GDPR的链接,但我们说这只是上下文。

它需要的不仅仅是用户帐户,密码和机器。使用DPAPI对数据加密有更多的熵。

请参阅:https://msdn.microsoft.com/en-us/library/ms995355.aspx#windataprotection-dpapi_topic02

  

使用登录密码的一个小缺点是所有应用程序   在同一用户下运行可以访问它们的任何受保护数据   知道关于。当然,因为应用程序必须存储自己的   受保护的数据,获得数据访问可能有点困难   对于其他应用程序,但肯定不是不可能。抵消   这样,DPAPI允许应用程序在使用时使用额外的秘密   保护数据。然后需要这个额外的秘密来取消保护   数据。从技术上讲,这个“秘密”应该被称为次要的   熵。它是次要的,因为它没有加强关键   用于加密数据,确实增加了一个人的难度   应用程序,在同一用户下运行,以妥协另一个   应用程序的加密密钥。应用程序应该注意如何   他们使用并存储这个熵。如果它只是保存到文件中   没有保护,然后对手可以访问熵并使用它   取消保护应用程序的数据。此外,该应用程序可以   传递将由DPAPI用于提示的数据结构   用户。这种“提示结构”允许用户指定一个附加的   此特定数据的密码。我们进一步讨论这个结构   在使用DPAPI部分。