Fungsi CryptProtectMemory (dpapi.h)

Fungsi CryptProtectMemorymengenkripsi memori untuk mencegah orang lain melihat informasi sensitif dalam proses Anda. Misalnya, gunakan fungsi CryptProtectMemory untuk mengenkripsi memori yang berisi kata sandi. Mengenkripsi kata sandi mencegah orang lain melihatnya ketika proses di-page out ke file swap. Jika tidak, kata sandi dalam teks biasa dan dapat dilihat oleh orang lain.

Sintaks

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

Parameter

[in, out] pDataIn

Penunjuk ke blok memori untuk dienkripsi. Parameter cbDataIn menentukan jumlah byte yang akan dienkripsi. Jika data yang terkandung dalam ruang memori lebih kecil dari jumlah byte yang ditentukan, data di luar blok yang dimaksudkan akan dienkripsi. Jika lebih besar dari byte cbDataIn , maka hanya byte cbDataIn pertama yang akan dienkripsi.

[in] cbDataIn

Jumlah byte memori yang ditujukkan oleh parameter pData untuk dienkripsi. Jumlah byte harus kelipatan konstanta CRYPTPROTECTMEMORY_BLOCK_SIZE yang ditentukan dalam Wincrypt.h.

[in] dwFlags

Parameter ini bisa menjadi salah satu bendera berikut. Anda harus menentukan bendera yang sama saat mengenkripsi dan mendekripsi memori.

Nilai Makna
CRYPTPROTECTMEMORY_SAME_PROCESS
Mengenkripsi dan mendekripsi memori dalam proses yang sama. Aplikasi yang berjalan dalam proses yang berbeda tidak akan dapat mendekripsi data.
CRYPTPROTECTMEMORY_CROSS_PROCESS
Mengenkripsi dan mendekripsi memori dalam proses yang berbeda. Aplikasi yang berjalan dalam proses yang berbeda akan dapat mendekripsi data.
CRYPTPROTECTMEMORY_SAME_LOGON
Gunakan kredensial masuk yang sama untuk mengenkripsi dan mendekripsi memori dalam proses yang berbeda. Aplikasi yang berjalan dalam proses yang berbeda akan dapat mendekripsi data. Namun, proses harus berjalan sebagai pengguna yang sama yang mengenkripsi data dan dalam sesi masuk yang sama.

Nilai kembali

Jika fungsi berhasil, fungsi mengembalikan TRUE.

Jika fungsi gagal, fungsi akan mengembalikan FALSE. Untuk informasi kesalahan yang diperluas, hubungi GetLastError.

Keterangan

Menggunakan CryptProtectMemory dan CryptUnprotectMemory untuk enkripsi kata sandi tidak aman karena data ada sebagai teks biasa dalam memori sebelum dienkripsi dan kapan saja pemanggil mendekripsinya untuk digunakan.

Biasanya, Anda menggunakan fungsi CryptProtectMemory untuk mengenkripsi informasi sensitif yang akan Anda dekripsi saat proses Anda berjalan. Jangan gunakan fungsi ini untuk menyimpan data yang ingin Anda dekripsi nanti; Anda tidak akan dapat mendekripsi data jika komputer dimulai ulang. Untuk menyimpan data terenkripsi ke file untuk didekripsi nanti, gunakan fungsi CryptProtectData .

Panggil fungsi CryptUnprotectMemory untuk mendekripsi memori yang dienkripsi dengan fungsi CryptProtectMemory . Setelah Anda selesai menggunakan informasi sensitif, bersihkan dari memori dengan memanggil fungsi SecureZeroMemory .

Gunakan bendera CRYPTPROTECTMEMORY_CROSS_PROCESS atau CRYPTPROTECTMEMORY_SAME_LOGON jika Anda menggunakan RPC atau LRPC untuk meneruskan data terenkripsi ke proses lain. Proses penerimaan harus menentukan bendera yang sama untuk mendekripsi data. Selain itu, gunakan bendera ini jika Anda menggunakan memori bersama.

Jika klien menggunakan bendera CRYPTPROTECTMEMORY_SAME_LOGON, server harus meniru klien (RpcImpersonateClient) sebelum mendekripsi memori.

Contoh

Contoh berikut memanggil fungsi CryptProtectMemory untuk mengenkripsi data yang ada di memori.

#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;
}

Persyaratan

Persyaratan Nilai
Klien minimum yang didukung Windows Vista [aplikasi desktop | Aplikasi UWP]
Server minimum yang didukung Windows Server 2003 [aplikasi desktop | Aplikasi UWP]
Target Platform Windows
Header dpapi.h
Pustaka Crypt32.lib
DLL Crypt32.dll

Lihat juga

CryptProtectData

CryptUnprotectMemory

RtlDecryptMemory

RtlEncryptMemory