C++ 如何加密或存储数据,以便只有一组进程可以在Windows上共享数据?

C++ 如何加密或存储数据,以便只有一组进程可以在Windows上共享数据?,c++,windows,sqlite,security,encryption,C++,Windows,Sqlite,Security,Encryption,我正在编写一个应用程序T1,它使用SQLite数据库来存储一些敏感数据,并试图对其进行安全加密。 我面临的问题是,我不希望我的对称密钥存储在内存中,因为在这种情况下,任何其他进程都可以获取内存快照并访问我的密钥。 我已经研究了许多可能的类似问题: 但问题是它有两种不同的选择: CRYPTPROTECTMEMORY_SAME_PROCESS or CRYPTPROTECTMEMORY_CROSS_PROCESS CRYPTPROTECTMEMORY_SAME_进程的问题是它限制了对特定进程的访

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

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

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

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

我曾考虑过类似的选择,但没有适用于我的情况:

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

  • 在使用DPAPI时,只有您自己使用用户的登录密码/凭据来保护数据,其他进程才能访问受保护的数据。正如您所指出的,DPAPI确实说明了这一点:

    DPAPI中的密钥和密码

    DPAPI致力于为用户提供数据保护。由于DPAPI需要密码来提供保护,因此逻辑步骤是DPAPI使用用户的登录密码,在某种程度上,它确实使用了用户的登录密码。DPAPI实际上使用用户的登录凭据。在用户使用密码登录的典型系统中,登录凭据只是用户密码的散列。然而,在用户使用智能卡登录的系统中,凭证会有所不同。为了简单起见,我们将使用术语“用户密码”、“登录密码”或“仅密码”来引用此凭据

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

    从技术上讲,这个“秘密”应该被称为二次熵。它是次要的,因为虽然它不会加强用于加密数据的密钥,但它确实增加了在同一用户下运行的一个应用程序泄露另一个应用程序的加密密钥的难度。应用程序应该小心如何使用和存储该熵。如果只是将其保存到一个不受保护的文件中,那么对手可以访问熵并使用它来解除应用程序数据的保护

    所以,只要确保“额外的秘密”在您的合作进程之间是真正的秘密,这样其他应用程序就无法获得它。例如,使用私有IPC机制,如命名管道,在进程之间直接发送秘密,而无需其他应用程序窃听

    或者,您可以使用
    CRYPTPROTECTMEMORY\u SAME\u PROCESS
    本地保护对称密钥,然后与另一个协作进程创建安全的IPC连接,并以只有接收方知道如何解密的加密格式发送密钥(SChannel、SSL等),然后,接收器也可以使用
    CRYPTPROTECTMEMORY\u SAME\u\u过程
    本地存储解密的密钥