SHA 256与Indy

时间:2017-04-02 20:34:29

标签: indy delphi

我正在尝试使用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传递,但事实并非如此。   发生了什么事?

1 个答案:

答案 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.pasIdFIPS回调挂钩了相关的OpenSSL函数。