我正在尝试使用SHA-256加密功能,但没有成功。
我需要获取字符串和文件的哈希值。 我正在使用Delphi 10.1 Berlin和Indy for Hash。
我的代码:
uses System.Classes, IdHashSha, System.SysUtils;
function GetHashF(_filename: string): string;
var
sha: TIdHashSHA256;
fs: TFileStream;
begin
if TIdHashSHA256.IsAvailable then
begin
sha:= TIdHashSHA256.Create;
try
fs:= TFileStream.Create(_filename, fmOpenRead);
try
Result:= sha.HashStreamAsHex(fs);
finally
sha.Free;
end;
finally
fs.Free;
end;
end;
function GetHashS(_string: string): string;
var
sha: TIdHashSHA256;
begin
if TIdHashSHA256.IsAvailable then
begin
sha:= TIdHashSHA256.Create;
try
Result:= sha.HashStringAsHex(_string);
finally
sha.Free;
end;
end;
end;
但每当我这样做时,它会为两个函数返回一个干净的字符串(“”)
我使用断点检查它是否从IsAvaible
传递,但事实并非如此。
发生了什么事?
答案 0 :(得分:3)
目前,Indy只实现了一些哈希算法原生,但不包括SHA-256(我对该功能有created a ticket)。
对于未在本机实现的算法,Indy允许您挂钩您选择的外部哈希实现,以提供实际的哈希功能。您看到IsAvailable
返回false,因为您还没有完成该连接。
只要为IdFIPS
单元中的以下回调分配适当的包装函数,就可以使用所需的任何哈希实现:
IsHashingIntfAvail
UpdateHashInst
FinalHashInst
特别是对于SHA-256,还有:
GetSHA256HashInst
IsSHA256HashIntfAvail
默认情况下,Indy可以使用OpenSSL作为散列库:
将IdSSLOpenSSLHeaders
单元添加到您的uses
条款中
在运行时调用IdSSLOpenSSLHeaders.Load()
使用您的应用程序可执行文件部署OpenSSL二进制文件。
IdSSLOpenSSLHeaders.pas
为IdFIPS
回调挂钩了相关的OpenSSL函数。