【问题标题】:SHA 256 With IndySHA 256 与印地
【发布时间】:2021-04-16 08:34:10
【问题描述】:

我正在尝试使用 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 传递过来,它不是。 怎么回事?

【问题讨论】:

  • 你是这样编码的,即使实现对你不可用,执行仍在继续。

标签: indy delphi


【解决方案1】:

目前,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 函数。

【讨论】:

  • 需要特定版本的 OpenSSL 二进制文件?谢谢。
  • @strykerbits,任何 0.9.8l+ should 工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-08-19
  • 2012-08-09
  • 2019-02-24
  • 1970-01-01
  • 2021-01-22
  • 2013-06-03
  • 2021-04-28
相关资源
最近更新 更多