> Вообще говоря подойдёт любая one-way функция, совсем необязательно точно
> такая же как у UNIX, просто надо было от чего-то оттолкнуться.
Если односторонний, то это хэш.
var
hProv: HCRYPTPROV;
hHash: HCRYPTHASH;
dwLen, dwTmp: DWORD;
HashArray: array[0..31] of char; // Длина массива, чтоб хэш влезал
begin
CryptAcquireContext(@hProv, '', '', <Идентификатор криптопровайдера, я работаю
с ГОСТОМ через КриптоПро, поэтому стоит 75, ты вебери свой>, CRYPT_VERIFYCONTEXT);
CryptCreateHash(hProv, <идентификатор хеширующего алгоритма>, 0, 0, @hHash);
CryptHashData(hHash, @(Data[1]), Length(Data), 0);
dwTmp := sizeof(dwLen);
CryptGetHashParam(hHash, HP_HASHSIZE, @dwLen, @dwTmp, 0);
CryptGetHashParam(hHash, HP_HASHVAL, @HashArray, @dwLen, 0);
CryptDestroyHash(hHash);
CryptReleaseContext(hProv, 0);
end;
После отработки в HashArray — хэш, посчитанный из Data, его и используй для
сверки пароля. Прототипы функций есть в модуле WinCrypt.pas, там же
идентификаторы стандартных провайдеров и алгоритмов, могу выслать.
Posted via RSDN NNTP Server 1.9