SHA 256 与 Indy

SHA 256 With Indy

我正在尝试使用 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;

但每当我这样做时,它 returns 一个干净的字符串 ("") 用于两个函数。
我使用断点来检查它是否从 IsAvaible 传递,但不是。 怎么回事?

此时,Indy 只本地 实现了一些散列算法,但不包括 SHA-256(我有 created a ticket 的功能)。

对于非本机实现的算法,Indy 允许您挂钩您选择的外部哈希实现以提供实际的哈希功能。你看到 IsAvailable return false 因为你还没有完成连接。

您可以使用任何您想要的哈希实现,只要您将适当的包装函数分配给 IdFIPS 单元中的以下回调:

IsHashingIntfAvail
UpdateHashInst
FinalHashInst

特别是对于 SHA-256,还有:

GetSHA256HashInst
IsSHA256HashIntfAvail

默认情况下,Indy 可以使用 OpenSSL 作为哈希库:

  • IdSSLOpenSSLHeaders 单位添加到您的 uses 子句中

  • 在运行时调用 IdSSLOpenSSLHeaders.Load()

  • 使用您的应用可执行文件部署 OpenSSL 二进制文件。

IdSSLOpenSSLHeaders.pasIdFIPS 回调连接相关的 OpenSSL 函数。