Windows上的DPAPI提供了对任意数据进行加密和解密的功能。 DPAPI提供的功能包括
CryptProtectMemory
、CryptUnprotectMemory
、CryptProtectData
和CryptUnprotectData
。我怀疑 ntsecapi.h 中的函数 RtlEncryptMemory
和 RtlDecryptMemory
也使用 DPAPI,尽管文档中没有说明。
过去,加密密钥的安全性显然基于用户的凭据[1]。 如果 TPM 可用,DPAPI 是否会使用它来保护其加密密钥?如果是这样,对于前面列出的哪些函数来说是这样的?
如果攻击者可以转储整个 RAM(例如通过 DMA),使用 DPAPI 加密的敏感数据是否会受到保护?假设在这种情况下攻击者无法访问 TPM。
[1] https://learn.microsoft.com/en-us/previous-versions/ms995355(v=msdn.10)
我尝试在可用的 Microsoft 文档中搜索列出的所有功能、DPAPI 文档以及 Windows 如何使用 TPM(CNG 等)的文档。我还探索了像这样逆向 DPAPI 的论文:https://elie.net/static/files/recovering-windows-secrets-and-efs-certificates-offline/recovering-windows-secrets-and-efs-certificates-offline -paper.pdf
不幸的是,这些信息要么已经过时,要么太笼统而无用。
CNG DPAPI 由两个函数组成,
CryptProtectData
和 CryptUnprotectData
。可信平台模块(TPM)技术旨在提供基于硬件的安全相关功能,主要涉及加密密钥。
与纯软件 CNG 提供商相比,TPM 功能提供密钥保护。平台加密提供商可以在 TPM 中创建密钥,并限制其使用。就我而言,为了保护密钥,您可以尝试在 TPM 中创建密钥,而不是将密钥存储在 TPM 中。
有关更多详细信息,我建议您可以参考文档: