C++ 如何加密或存储数据,以便只有一组进程可以在Windows上共享数据?
我正在编写一个应用程序T1,它使用SQLite数据库来存储一些敏感数据,并试图对其进行安全加密。 我面临的问题是,我不希望我的对称密钥存储在内存中,因为在这种情况下,任何其他进程都可以获取内存快照并访问我的密钥。 我已经研究了许多可能的类似问题: 但问题是它有两种不同的选择:C++ 如何加密或存储数据,以便只有一组进程可以在Windows上共享数据?,c++,windows,sqlite,security,encryption,C++,Windows,Sqlite,Security,Encryption,我正在编写一个应用程序T1,它使用SQLite数据库来存储一些敏感数据,并试图对其进行安全加密。 我面临的问题是,我不希望我的对称密钥存储在内存中,因为在这种情况下,任何其他进程都可以获取内存快照并访问我的密钥。 我已经研究了许多可能的类似问题: 但问题是它有两种不同的选择: CRYPTPROTECTMEMORY_SAME_PROCESS or CRYPTPROTECTMEMORY_CROSS_PROCESS CRYPTPROTECTMEMORY_SAME_进程的问题是它限制了对特定进程的访
CRYPTPROTECTMEMORY_SAME_PROCESS or CRYPTPROTECTMEMORY_CROSS_PROCESS
CRYPTPROTECTMEMORY_SAME_进程的问题是它限制了对特定进程的访问(我的应用程序有一个单独的UI进程,它也可以访问数据库)CRYPTPROTECTMEMORY_CROSS_进程的问题是,它允许登录用户的所有进程访问这些数据,这有点违背了目的
所以我想要的是一个API,在这里我只能指定一个进程池来访问我的数据/密钥
我曾考虑过类似的选择,但没有适用于我的情况:
在使用DPAPI时,只有您自己使用用户的登录密码/凭据来保护数据,其他进程才能访问受保护的数据。正如您所指出的,DPAPI确实说明了这一点: DPAPI中的密钥和密码 DPAPI致力于为用户提供数据保护。由于DPAPI需要密码来提供保护,因此逻辑步骤是DPAPI使用用户的登录密码,在某种程度上,它确实使用了用户的登录密码。DPAPI实际上使用用户的登录凭据。在用户使用密码登录的典型系统中,登录凭据只是用户密码的散列。然而,在用户使用智能卡登录的系统中,凭证会有所不同。为了简单起见,我们将使用术语“用户密码”、“登录密码”或“仅密码”来引用此凭据 使用登录密码的一个小缺点是,在同一用户下运行的所有应用程序都可以访问他们知道的任何受保护的数据。当然,因为应用程序必须存储自己的受保护数据,所以对其他应用程序来说,访问数据可能有点困难,但肯定不是不可能的为了解决这个问题,DPAPI允许应用程序在保护数据时使用额外的秘密。然后需要此额外的机密来解除数据保护。 从技术上讲,这个“秘密”应该被称为二次熵。它是次要的,因为虽然它不会加强用于加密数据的密钥,但它确实增加了在同一用户下运行的一个应用程序泄露另一个应用程序的加密密钥的难度。应用程序应该小心如何使用和存储该熵。如果只是将其保存到一个不受保护的文件中,那么对手可以访问熵并使用它来解除应用程序数据的保护 所以,只要确保“额外的秘密”在您的合作进程之间是真正的秘密,这样其他应用程序就无法获得它。例如,使用私有IPC机制,如命名管道,在进程之间直接发送秘密,而无需其他应用程序窃听 或者,您可以使用
CRYPTPROTECTMEMORY\u SAME\u PROCESS
本地保护对称密钥,然后与另一个协作进程创建安全的IPC连接,并以只有接收方知道如何解密的加密格式发送密钥(SChannel、SSL等),然后,接收器也可以使用CRYPTPROTECTMEMORY\u SAME\u\u过程
本地存储解密的密钥