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

此参数可以是以下标志之一。 加密和解密内存时,必须指定相同的标志。

含义
CRYPTPROTECTMEMORY_SAME_PROCESS
在同一进程中加密和解密内存。 在不同进程中运行的应用程序将无法解密数据。
CRYPTPROTECTMEMORY_CROSS_PROCESS
在不同进程中加密和解密内存。 在不同进程中运行的应用程序将能够解密数据。
CRYPTPROTECTMEMORY_SAME_LOGON
使用相同的登录凭据在不同进程中加密和解密内存。 在不同进程中运行的应用程序将能够解密数据。 但是,进程必须以加密数据的同一用户身份运行,并在同一登录会话中运行。

返回值

如果函数成功,则函数返回 TRUE

如果函数失败,则返回 FALSE。 有关扩展的错误信息,请调用 GetLastError

备注

使用 CryptProtectMemoryCryptUnprotectMemory 进行密码加密是不安全的,因为数据在加密之前以纯文本形式存在于内存中,并且调用方随时解密它以供使用。

必须在同一启动会话期间加密和解密内存。 如果在调用 CryptUnprotectMemory 函数之前重启计算机,将无法解密数据。

必须将相同的标志传递给 CryptUnprotectMemoryCryptProtectMemory。 如果传递不同的标志, 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

另请参阅

CryptProtectMemory

CryptUnprotectData

RtlDecryptMemory

RtlEncryptMemory