Необходимо использовать API шифрования Win32 для преобразования пароля в зашифрованный BLOB-объект перед передачей в дочерний процесс.
Попытка использовать CryptProtectData@crypt32.dll
API для выполнения шифрования.
Функция возвращает успех. Но я столкнулся с проблемой при доступе к возвращенному зашифрованному BLOB-объекту.
Пытался использовать StrPas()
для преобразования PAnsiChar
в AnsiString
, но я получаю "Неверный идентификатор" ошибка.
const
CRYPTPROTECT_LOCAL_MACHINE = $4;
type
DataBlob = record
cbData: Longword;
pbData: PAnsiChar;
end;
function CryptProtectData(var pDataIn: DataBlob;
szDataDescr, pOptionalEntropy, pvReserved, pPromptStruct : DWORD;
dwFlags: DWORD; var pDataOut: DataBlob): Boolean;
external 'CryptProtectData@crypt32.dll stdcall delayload';
var
Password: AnsiString;
function Encrypt(): Boolean;
var
DataBlobIn, DataBlobOut: DataBlob
EncryptStr: AnsiString;
begin
DataBlobIn.cbData := Length(Password);
DataBlobIn.pbData := Password;
if CryptProtectData(DataBlobIn, 0, 0, 0, 0, CRYPTPROTECT_LOCAL_MACHINE, DataBlobOut) then
begin
Log('Success');
{ Using StrPas gives an 'unknown identifier error' }
EncryptStr := StrPas(DataBlobOut.pbData);
end;
end;
Размер возвращаемого блоба памяти DataBlobOut.cbData
,
но как получить доступ к блобу памяти, возвращенному в DataBlobOut.pbData
?
Не могли бы вы указать пример кода, где мы можем получить доступ к памяти длиной X?