CryptProtectMemory 함수(dpapi.h)

CryptProtectMemory 함수는 다른 사용자가 프로세스에서 중요한 정보를 볼 수 없도록 메모리를 암호화합니다. 예를 들어 CryptProtectMemory 함수를 사용하여 암호를 포함하는 메모리를 암호화합니다. 암호를 암호화하면 프로세스가 스왑 파일로 페이징되면 다른 사용자가 암호를 볼 수 없습니다. 그렇지 않으면 암호가 일반 텍스트 로 표시되고 다른 사용자가 볼 수 있습니다.

구문

DPAPI_IMP BOOL CryptProtectMemory(
  [in, out] LPVOID pDataIn,
  [in]      DWORD  cbDataIn,
  [in]      DWORD  dwFlags
);

매개 변수

[in, out] pDataIn

암호화할 메모리 블록에 대한 포인터입니다. cbDataIn 매개 변수는 암호화할 바이트 수를 지정합니다. 메모리 공간에 포함된 데이터가 지정된 바이트 수보다 작으면 의도한 블록 외부의 데이터가 암호화됩니다. cbDataIn 바이트보다 큰 경우 첫 번째 cbDataIn 바이트만 암호화됩니다.

[in] cbDataIn

암호화할 pData 매개 변수가 가리키는 메모리 바이트 수입니다. 바이트 수는 Wincrypt.h에 정의된 CRYPTPROTECTMEMORY_BLOCK_SIZE 상수의 배수여야 합니다.

[in] dwFlags

이 매개 변수는 다음 플래그 중 하나일 수 있습니다. 메모리를 암호화하고 암호 해독할 때 동일한 플래그를 지정해야 합니다.

의미
CRYPTPROTECTMEMORY_SAME_PROCESS
동일한 프로세스에서 메모리를 암호화하고 암호 해독합니다. 다른 프로세스에서 실행되는 애플리케이션은 데이터의 암호를 해독할 수 없습니다.
CRYPTPROTECTMEMORY_CROSS_PROCESS
다양한 프로세스에서 메모리를 암호화하고 암호 해독합니다. 다른 프로세스에서 실행되는 애플리케이션은 데이터의 암호를 해독할 수 있습니다.
CRYPTPROTECTMEMORY_SAME_LOGON
동일한 로그온 자격 증명을 사용하여 다른 프로세스에서 메모리를 암호화하고 암호 해독합니다. 다른 프로세스에서 실행되는 애플리케이션은 데이터의 암호를 해독할 수 있습니다. 그러나 프로세스는 데이터를 암호화한 동일한 사용자와 동일한 로그온 세션에서 실행되어야 합니다.

반환 값

함수가 성공하면 함수는 TRUE를 반환합니다.

함수가 실패하면 FALSE를 반환합니다. 확장된 오류 정보는 GetLastError를 호출합니다.

설명

암호 암호화 에 CryptProtectMemoryCryptUnprotectMemory 를 사용하는 것은 데이터가 암호화되기 전에 메모리에 일반 텍스트로 존재하고 호출자가 사용하기 위해 암호를 해독하기 때문에 안전하지 않습니다.

일반적으로 CryptProtectMemory 함수를 사용하여 프로세스가 실행되는 동안 암호 해독할 중요한 정보를 암호화합니다. 나중에 암호 해독하려는 데이터를 저장하려면 이 함수를 사용하지 마세요. 컴퓨터를 다시 시작하면 데이터의 암호를 해독할 수 없습니다. 암호화된 데이터를 파일에 저장하여 나중에 암호를 해독하려면 CryptProtectData 함수를 사용합니다.

CryptProtectMemory 함수를 호출하여 CryptProtectMemory 함수로 암호화된 메모리의 암호를 해독합니다. 중요한 정보 사용을 마쳤으면 SecureZeroMemory 함수를 호출하여 메모리에서 지웁습니다.

RPC 또는 LRPC를 사용하여 암호화된 데이터를 다른 프로세스에 전달하는 경우 CRYPTPROTECTMEMORY_CROSS_PROCESS 또는 CRYPTPROTECTMEMORY_SAME_LOGON 플래그를 사용합니다. 수신 프로세스는 데이터의 암호를 해독하기 위해 동일한 플래그를 지정해야 합니다. 또한 공유 메모리를 사용하는 경우 이러한 플래그를 사용합니다.

클라이언트가 CRYPTPROTECTMEMORY_SAME_LOGON 플래그를 사용하는 경우 서버는 메모리 암호를 해독하기 전에 클라이언트(RpcImpersonateClient)를 가장해야 합니다.

예제

다음 예제에서는 CryptProtectMemory 함수를 호출하여 메모리에 있는 데이터를 암호화합니다.

#include <windows.h>
#include <stdio.h>
#include <Wincrypt.h>

#define SSN_STR_LEN 12  // includes null

void main()
{
    HRESULT hr = S_OK;
    LPWSTR pSensitiveText = NULL;
    DWORD cbSensitiveText = 0;
    DWORD cbPlainText = SSN_STR_LEN*sizeof(WCHAR);
    DWORD dwMod = 0;

    //  Memory to encrypt must be a multiple of CRYPTPROTECTMEMORY_BLOCK_SIZE.
    if (dwMod = cbPlainText % CRYPTPROTECTMEMORY_BLOCK_SIZE)
        cbSensitiveText = cbPlainText +
		(CRYPTPROTECTMEMORY_BLOCK_SIZE - dwMod);
    else
        cbSensitiveText = cbPlainText;

    pSensitiveText = (LPWSTR)LocalAlloc(LPTR, cbSensitiveText);
    if (NULL == pSensitiveText)
    {
        wprintf(L"Memory allocation failed.\n");
        return E_OUTOFMEMORY;
    }

    //  Place sensitive string to encrypt in pSensitiveText.

    if (!CryptProtectMemory(pSensitiveText, cbSensitiveText,
		CRYPTPROTECTMEMORY_SAME_PROCESS))
    {
        wprintf(L"CryptProtectMemory failed: %d\n", GetLastError());
        SecureZeroMemory(pSensitiveText, cbSensitiveText);
        LocalFree(pSensitiveText);
        pSensitiveText = NULL;
        return E_FAIL;
    }

    //  Call CryptUnprotectMemory to decrypt and use the memory.

    SecureZeroMemory(pSensitiveText, cbSensitiveText);
    LocalFree(pSensitiveText);
    pSensitiveText = NULL;

    return hr;
}

요구 사항

요구 사항
지원되는 최소 클라이언트 Windows Vista [데스크톱 앱 | UWP 앱]
지원되는 최소 서버 Windows Server 2003 [데스크톱 앱 | UWP 앱]
대상 플랫폼 Windows
헤더 dpapi.h
라이브러리 Crypt32.lib
DLL Crypt32.dll

추가 정보

CryptProtectData

CryptUnprotectMemory

RtlDecryptMemory

RtlEncryptMemory