Partager via


Fonction CryptProtectMemory (dpapi.h)

La fonction CryptProtectMemorychiffre la mémoire pour empêcher d’autres utilisateurs d’afficher des informations sensibles dans votre processus. Par exemple, utilisez la fonction CryptProtectMemory pour chiffrer la mémoire contenant un mot de passe. Le chiffrement du mot de passe empêche d’autres utilisateurs de l’afficher lorsque le processus est paginé dans le fichier d’échange. Sinon, le mot de passe est en texte clair et visible par d’autres personnes.

Syntaxe

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

Paramètres

[in, out] pDataIn

Pointeur vers le bloc de mémoire à chiffrer. Le paramètre cbDataIn spécifie le nombre d’octets qui seront chiffrés. Si les données contenues dans l’espace mémoire sont inférieures au nombre d’octets spécifié, les données en dehors du bloc prévu sont chiffrées. S’il est supérieur à cbDataIn octets, seuls les premiers octets cbDataIn sont chiffrés.

[in] cbDataIn

Nombre d’octets de mémoire pointés vers le paramètre pData à chiffrer. Le nombre d’octets doit être un multiple de la constante CRYPTPROTECTMEMORY_BLOCK_SIZE définie dans Wincrypt.h.

[in] dwFlags

Ce paramètre peut être l’un des indicateurs suivants. Vous devez spécifier le même indicateur lors du chiffrement et du déchiffrement de la mémoire.

Valeur Signification
CRYPTPROTECTMEMORY_SAME_PROCESS
Chiffrer et déchiffrer la mémoire dans le même processus. Une application s’exécutant dans un autre processus ne peut pas déchiffrer les données.
CRYPTPROTECTMEMORY_CROSS_PROCESS
Chiffrer et déchiffrer la mémoire dans différents processus. Une application s’exécutant dans un autre processus sera en mesure de déchiffrer les données.
CRYPTPROTECTMEMORY_SAME_LOGON
Utilisez les mêmes informations d’identification d’ouverture de session pour chiffrer et déchiffrer la mémoire dans différents processus. Une application s’exécutant dans un autre processus sera en mesure de déchiffrer les données. Toutefois, le processus doit s’exécuter en tant qu’utilisateur qui a chiffré les données et dans la même session d’ouverture de session.

Valeur retournée

Si la fonction réussit, la fonction retourne TRUE.

Si la fonction échoue, elle retourne FALSE. Pour obtenir des informations d’erreur étendues, appelez GetLastError.

Remarques

L’utilisation de CryptProtectMemory et CryptUnprotectMemory pour le chiffrement de mot de passe n’est pas sécurisée, car les données existent sous forme de texte clair dans la mémoire avant qu’elles ne soient chiffrées et à tout moment l’appelant les déchiffre pour les utiliser.

En règle générale, vous utilisez la fonction CryptProtectMemory pour chiffrer les informations sensibles que vous allez déchiffrer pendant l’exécution de votre processus. N’utilisez pas cette fonction pour enregistrer les données que vous souhaitez déchiffrer ultérieurement ; vous ne pourrez pas déchiffrer les données si l’ordinateur est redémarré. Pour enregistrer des données chiffrées dans un fichier afin de les déchiffrer ultérieurement, utilisez la fonction CryptProtectData .

Appelez la fonction CryptUnprotectMemory pour déchiffrer la mémoire chiffrée avec la fonction CryptProtectMemory . Lorsque vous avez terminé d’utiliser les informations sensibles, effacez-les de la mémoire en appelant la fonction SecureZeroMemory .

Utilisez l’indicateur CRYPTPROTECTMEMORY_CROSS_PROCESS ou CRYPTPROTECTMEMORY_SAME_LOGON si vous utilisez RPC ou LRPC pour passer des données chiffrées à un autre processus. Le processus de réception doit spécifier le même indicateur pour déchiffrer les données. Utilisez également ces indicateurs si vous utilisez la mémoire partagée.

Si le client utilise l’indicateur CRYPTPROTECTMEMORY_SAME_LOGON, le serveur doit emprunter l’identité du client (RpcImpersonateClient) avant de déchiffrer la mémoire.

Exemples

L’exemple suivant appelle la fonction CryptProtectMemory pour chiffrer les données en mémoire.

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

Configuration requise

Condition requise Valeur
Client minimal pris en charge Windows Vista [applications de bureau | applications UWP]
Serveur minimal pris en charge Windows Server 2003 [applications de bureau | applications UWP]
Plateforme cible Windows
En-tête dpapi.h
Bibliothèque Crypt32.lib
DLL Crypt32.dll

Voir aussi

CryptProtectData

CryptUnprotectMemory

RtlDecryptMemory

RtlEncryptMemory