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 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 |