2013-11-26 26 views
1

经过痛苦的调试会话后,我发现TIdHashSHA1.HashStream不尊重它的ASize参数。考虑以下代码:在Delphi 2010中TIdHashSHA1.HashStream是否被破解?

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; 

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

回答

1

你是对的TIdHashSHA1(具体来说,TIdHashSHA1.NativeGetHashBytes()方法)忽略了ASize参数。它从输入流中读取数据,直到读取少于64个字节,然而需要很长的时间。这似乎是一个需要修复的错误。它不应该比实际要求的更多。我已经在Indy的bug跟踪器中打开过票。

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

+0

门票,以防某人的好奇心:http://indy.codeplex.com/workitem/24912 – eis

+0

另外:http://code.google.com/p/indyproject/issues/detail?id=270 –

+0

@ ThijsvanDien:我已经在Indy的SVN中检查了更新到“TIdHashSHA1”。一旦你确认修补程序正在工作,我将关闭门票。 –

1

现在已经确认是一个错误,我用TGpStreamWindow做了一个解决方法。

相关问题