我在Delphi XE2上使用该函数来散列字符串。
如果程序在Windows 10上运行,我会得到一个坏结果——结果是null
,因为TidHashSHA512.isavailable
是FALSE
。
我该怎么办?
function HashSHA512String(Text: String): String;
var
IdHashSHA512: TIdHashSHA512;
begin
Result := '';
if HashFunctionsOpenSSLLoaded then begin
if TIdHashSHA512.IsAvailable then begin // <-- ADD THIS
IdHashSHA512 := TIdHashSHA512.Create;
try
Result := IdHashSHA512.HashStringAsHex(Text);
finally
FreeAndNil(IdHashSHA512);
end;
end;
end;
end;
Indy的大多数SHA哈希都依赖于您的应用程序将外部哈希库连接到Indy。目前只有SHA-1(在少数其他非SHA散列中)是本机实现的。
要启用SHA-512,必须在运行时分配IdFIPS
单元中的以下回调函数指针:
IsHashingIntfAvail
UpdateHashInst
FinalHashInst
IsSHA512HashIntfAvail
GetSHA512HashInst
您可以使用任何所需的哈希库,只要将上述函数指针分配给合适的函数即可。
Indy提供了一个使用OpenSSL中哈希函数的实现。要使用它,您可以:
-
将
IdSSLOpenSSLHeaders
单元添加到uses
子句中,然后在运行时调用其Load()
函数。 -
将
IdSSLOpenSSL
单元添加到uses
子句中,然后在运行时调用其LoadOpenSSLLibrary()
函数。
无论哪种方式,您都必须随应用程序分发两个OpenSSL dll(libeay32.dll和ssleay32..dll,您可以从Indy的Fulgan镜像下载)。请确保使用已在启用SHA-512的情况下编译的内部版本。