如何加密或存储数据,以便只有进程池才能在 Windows 上共享数据

How to encrypt or store data so that only a pool of processes can share it on Windows?

本文关键字:数据 进程 共享 Windows 加密 何加密 存储      更新时间:2023-10-16

我正在编写一个应用程序T1,它使用SQLite数据库来存储一些敏感数据,我正在尝试安全地加密它。我面临的问题是我不希望我的对称密钥存储在内存中,因为在这种情况下,任何其他进程都可以拍摄内存快照并访问我的密钥。我看过很多可能类似的问题:

CryptProtectMemory/CryptProtectdata

但问题是它有两种不同的选择——

CRYPTPROTECTMEMORY_SAME_PROCESS or CRYPTPROTECTMEMORY_CROSS_PROCESS

CRYPTPROTECTMEMORY_SAME_PROCESS的问题在于它限制了对特定进程的访问(我的应用程序有一个单独的 UI 进程,也可以访问数据库),CRYPTPROTECTMEMORY_CROSS_PROCESS的问题在于它允许登录用户的所有进程访问这些数据,这有点违背了目的

所以我想要的是一个API,我只能指定一个可以访问我的数据/密钥的进程池

我查看了类似的选项,但在我的情况下没有任何适用:

  1. 使用 DPAPI - 这会将加密密钥绑定到您的管理员登录名,但问题是我不信任当前登录的用户。事实上,我想对除了 T1 和我的 UI 进程之外的任何人隐藏这一点。我知道我可以添加二次熵,以限制当前登录的用户访问数据。但是,我需要将此秘密数据存储在计算机上。我该如何保护它...似乎是递归问题。
  2. 外部硬件或将密钥存储在远程服务器上 - 由于应用程序将部署在许多商业端点(可能没有特定的硬件)上,并且它也需要在离线模式下工作(服务器可能无法访问)。
  3. 将密钥存储在数据库中 - 我需要保护数据库,这在我的情况下又是一种递归。
使用

DPAPI 时,仅当您单独使用用户的登录密码/凭据来保护数据时,其他进程才能访问受保护的数据。 正如您所指出的,DPAPI 确实考虑到了这一点:

视窗数据保护

DPAPI 中的密钥和密码

DPAPI 专注于为用户提供数据保护。由于 DPAPI 需要密码才能提供保护,因此逻辑步骤是 DPAPI 使用用户的登录密码,它以某种方式使用。DPAPI 实际上使用用户的登录凭据。在用户使用密码登录的典型系统中,登录凭据只是用户密码的哈希。但是,在用户使用智能卡登录的系统中,凭据会有所不同。为简单起见,我们将使用术语"用户密码"、"登录密码"或"仅密码"来指代此凭据。

使用登录密码的一个小缺点是,在同一用户下运行的所有应用程序都可以访问他们知道的任何受保护数据。当然,由于应用程序必须存储自己的受保护数据,因此对于其他应用程序来说,访问数据可能有些困难,但肯定并非不可能。为了抵消这种情况,DPAPI 允许应用程序在保护数据时使用额外的机密。然后需要此附加密钥来取消保护数据。

从技术上讲,这个"秘密"应该称为次级熵。它是次要的,因为虽然它不会加强用于加密数据的密钥,但它确实增加了在同一用户下运行的一个应用程序破坏另一个应用程序的加密密钥的难度。应用程序应该小心如何使用和存储这个熵。如果只是将其保存到未受保护的文件中,则攻击者可以访问熵并使用它来取消保护应用程序的数据。

因此,只需确保"附加机密"确实是协作进程之间的秘密,因此没有其他应用程序可以获取它。 例如,使用专用 IPC 机制(如命名管道)直接在进程之间发送机密,而不会窃听其他应用程序。

或者,您可以使用CRYPTPROTECTMEMORY_SAME_PROCESS在本地保护您的对称密钥,然后与其他协作进程创建安全的 IPC 连接,并以只有接收方知道如何解密的加密格式发送密钥(SChannel、SSL 等),然后接收方也可以使用 CRYPTPROTECTMEMORY_SAME_PROCESS 在本地存储解密的密钥。