delphi - Delphi 2010 中的 TIdHashSHA1.HashStream 是否损坏?

标签 delphi delphi-2010 indy

经过痛苦的调试 session 后,我发现 TIdHashSHA1.HashStream 不尊重其 ASize 参数。考虑以下代码:

var
  Hasher: TIdHashSHA1;
  MS: TMemoryStream;
begin
  MS := TMemoryStream.Create;
  Hasher := TIdHashSHA1.Create;
  try
    MS.LoadFromFile('C:\windows\notepad.exe');
    MS.Position := 0;
    ShowMessage(Hasher.HashStreamAsHex(MS));
    MS.Position := 0;
    ShowMessage(Hasher.HashStreamAsHex(MS, 0, MS.Size - 10));
  finally
    Hasher.Free;
    MS.Free;
  end;
end;

结果是一样的。这是一个错误还是我做错了什么?如果这确实是一个错误,那么在不复制我想要散列的流部分的情况下绕过它的最简单方法是什么?

最佳答案

您认为 TIdHashSHA1(具体来说,TIdHashSHA1.NativeGetHashBytes() 方法)忽略 ASize 参数是正确的。它从输入流中读取数据,直到读取的字节数少于 64 个字节,无论这需要多长时间。这似乎确实是一个需要修复的错误。阅读的内容不应超过实际要求的内容。我已经为此在 Indy 的 bug 跟踪器中开了票。

由于该错误与实际进行数据哈希处理的方法相同,因此在我发布官方修复之前,您可以采取的唯一解决方法是在 中自行修复 NativeGetHashBytes() >IdHashSHA.pas 然后重新编译 Indy(或者,如果您没有使用运行时包,您可以制作 IdHashSHA.pas 的本地副本并将其添加到您的项目中,然后修复复制)。

关于delphi - Delphi 2010 中的 TIdHashSHA1.HashStream 是否损坏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20225940/

相关文章:

delphi - 用于在Intraweb VCL中使https工作的pem文件对于Web

delphi - Spring4D TDistinctIterator<string>.ToArray() 不工作?

delphi - 如何通过使用delphi 7中的API获取Netstat信息

delphi - 如何将 "array of strings"从 inno setup 传递到 Delphi Dll?

delphi - 是否可以创建通用的约束方法?

delphi - 将 TAction 重命名为另一种形式

delphi - 即使 IdHttp 连接出错,如何获取响应内容?

multithreading - IdHttpServer OnCommandGet 事件是否在线程内运行?

delphi - 如何判断图形或图片是否损坏?

javascript - 无法作为交 key 系统在 map 上绘制位置