2016-08-11 64 views
1

我用delphi编写下面的代码。sha1在delphi中的校验和

with TIdHashMessageDigest5.Create do begin 
    st2.Position := 0; 
    Digest := HashValue(st2); 
    SetLength(Hash, 16); 
    Move(Digest, Hash[1], 16); 
    Free; 
end; 

我需要将其转换为使用SHA1散列。我在库中找不到SHA1类型。谁能帮忙?我在互联网上寻找帮助,但找不到任何。

+1

SHA1不安全不含任何添加剂的 –

回答

0

你似乎使用Indy 9,它不支持SHA1。在Indy 10中添加了SHA1(以及一些其他SHA,包括几个其他SHA)。TIdHash的接口也在Indy 10中重写。在其他更改中,HashValue()方法被替换为新的Hash...()Hash...AsHex()方法(HashString(AsHex)HashStream(AsHex)HashBytes(AsHex)),例如:

uses 
    ..., IdHash, IdHashMessageDigest; 

var 
    Hash: TIdBytes; 
begin 
    with TIdHashMessageDigest5.Create do 
    try 
    st2.Position := 0; 
    Hash := HashStream(st2); 
    finally 
    Free; 
    end; 
    // use Hash as needed... 
end;  

uses 
    ..., IdHash, IdHashSHA; 

var 
    Hash: TIdBytes; 
begin 
    with TIdHashSHA1.Create do 
    try 
    st2.Position := 0; 
    Hash := HashStream(st2); 
    finally 
    Free; 
    end; 
    // use Hash as needed... 
end;  
+0

嗨雷米, 感谢您的时间。我会用它来看看它是如何为我工作的。我正在使用德尔福2005年。你可以建议从哪里获取IdGlobal.pas作为我产生了很多“未声明的标识符”错误? – MKK

+0

@MKK如?仅靠自己获得更新的IdGlobal.pas是不够的,你需要整个Indy库的更新版本。 –

3

在这里看到:

https://sergworks.wordpress.com/2014/10/25/high-performance-hash-library/

SHA1 hashing in Delphi XE

https://sourceforge.net/projects/sha1implementat/

http://www.colorfultyping.com/generating-a-sha-1-checksum-for-a-given-class-type/

顺便说一句,你没有提到你的Delphi的版本。如果您使用的是最新版本(XE起),我想,它的标准库应该支持SHA-1,MD5等

你可以做这样的:

uses IdHashSHA; 

function SHA1FromString(const AString: string): string; 
var 
    SHA1: TIdHashSHA1; 
begin 
    SHA1 := TIdHashSHA1.Create; 
    try 
    Result := SHA1.HashStringAsHex(AString); 
    finally 
    SHA1.Free; 
    end; 
end; 
+0

答案,但off-site链接是不能接受的在这里。 –

0

两个更多的选择:

http://www.spring4d.org

unit Spring.Cryptography.SHA; 

TSHA1 = class(THashAlgorithmBase, ISHA1) 

http://lockbox.seanbdurkin.id.au/HomePage

unit LbProc; 
procedure StreamHashSHA1(var Digest : TSHA1Digest; AStream : TStream); 
procedure FileHashSHA1(var Digest : TSHA1Digest; const AFileName : string);