cryptUnprotectMemory 函数 (dpapi.h)
CryptUnprotectMemory 函数解密使用 CryptProtectMemory 函数加密的内存。
语法
DPAPI_IMP BOOL CryptUnprotectMemory(
[in, out] LPVOID pDataIn,
[in] DWORD cbDataIn,
[in] DWORD dwFlags
);
参数
[in, out] pDataIn
指向要解密的内存块的指针。 cbData 参数指定函数将尝试解密的字节数。 如果内存空间中包含的数据小于指定的字节数,则函数将尝试解密预期块外部的数据。 如果它大于 cbData 字节,则只会解密第一个 cbData 字节。
[in] cbDataIn
要解密的 pData 参数指向的内存字节数。 字节数必须是 Wincrypt.h 中定义的 CRYPTPROTECTMEMORY_BLOCK_SIZE 常量的倍数。
[in] dwFlags
此参数可以是以下标志之一。 加密和解密内存时,必须指定相同的标志。
返回值
如果函数成功,则函数返回 TRUE。
如果函数失败,则返回 FALSE。 有关扩展的错误信息,请调用 GetLastError。
备注
使用 CryptProtectMemory 和 CryptUnprotectMemory 进行密码加密是不安全的,因为数据在加密之前以纯文本形式存在于内存中,并且调用方随时解密它以供使用。
必须在同一启动会话期间加密和解密内存。 如果在调用 CryptUnprotectMemory 函数之前重启计算机,将无法解密数据。
必须将相同的标志传递给 CryptUnprotectMemory 和 CryptProtectMemory。 如果传递不同的标志, CryptUnprotectMemory 函数将成功;但是,结果不可预知。
使用完敏感信息后,通过调用 SecureZeroMemory 函数将其从内存中清除。
示例
以下示例调用 CryptUnprotectMemory 函数来解密内存中的数据。 该示例假定变量 pEncryptedText 指向已使用 CryptProtectMemory 函数加密的字符串。
#include <windows.h>
#include <stdio.h>
#include <Wincrypt.h>
#include <strsafe.h>
#pragma comment(lib, "crypt32.lib")
void main()
{
LPWSTR pEncryptedText; // contains the encrypted text
DWORD cbEncryptedText; // number of bytes to which
// pEncryptedText points
if (CryptUnprotectMemory(pEncryptedText, cbEncryptedText,
CRYPTPROTECTMEMORY_SAME_PROCESS))
{
// Use the decrypted string.
}
else
{
wprintf(L"CryptUnprotectMemory failed: %d\n",
GetLastError());
}
// Clear and free memory after using
// the decrypted string or if an error occurs.
SecureZeroMemory(pEncryptedText, cbEncryptedText);
LocalFree(pEncryptedText);
pEncryptedText = NULL;
}
要求
最低受支持的客户端 | Windows Vista [桌面应用 | UWP 应用] |
最低受支持的服务器 | Windows Server 2003 [桌面应用 | UWP 应用] |
目标平台 | Windows |
标头 | dpapi.h |
Library | Crypt32.lib |
DLL | Crypt32.dll |