【发布时间】:2023-03-31 10:09:02
【问题描述】:
如何使用 Delphi 对字符串进行 MD5 哈希?
【问题讨论】:
-
附带说明,从 Delphi 2009 开始,Delphi 中的所有对象都有一个 GetHashCode 方法。
-
您在问两个不同的问题。一个在您的主题中,另一个在您的描述中。
标签: delphi hash cryptography md5
如何使用 Delphi 对字符串进行 MD5 哈希?
【问题讨论】:
标签: delphi hash cryptography md5
如果您想要一个 MD5 摘要并安装了Indy 组件,您可以这样做:
uses SysUtils, IdGlobal, IdHash, IdHashMessageDigest;
with TIdHashMessageDigest5.Create do
try
Result := TIdHash128.AsHex(HashValue('Hello, world'));
finally
Free;
end;
Delphi Cryptography Package 支持最流行的算法:
更新
DCPCrypt 现在由 Warren Postma 维护,源代码可以在 here 找到。
【讨论】:
如果您希望 MD5 哈希 字符串为十六进制,并且您已安装 Delphi XE 1,那么您拥有 Indy 10.5.7 组件可以这样做:
使用IdGlobal、IdHash、IdHashMessageDigest;
class function getMd5HashString(value: string): string;
var
hashMessageDigest5 : TIdHashMessageDigest5;
begin
hashMessageDigest5 := nil;
try
hashMessageDigest5 := TIdHashMessageDigest5.Create;
Result := IdGlobal.IndyLowerCase ( hashMessageDigest5.HashStringAsHex ( value ) );
finally
hashMessageDigest5.Free;
end;
end;
【讨论】:
我通常使用 David Barton (City in the Sky) 的 DCPCrypt2 (Delphi Cryptography Package)。
它还包含以下加密算法:
更新
DCPCrypt 现在由 Warren Postma 维护,源代码可以在 here 找到。
【讨论】:
为什么不使用 RTL 的 system.Hash 单元,它还包含自 Delphi Seattle 以来的 MD5 哈希算法?
MD5HashCode := THashMD5.GetHashString(ClearTextString);
【讨论】:
这是对 devstopfix 答案的修改,已被接受。
在当前的 Indy 版本中,您可以更轻松地散列字符串和流。示例:
function MD5String(str: String): String;
begin
with TIdHashMessageDigest5.Create do
try
Result := HashStringAsHex(str);
finally
Free;
end;
end;
使用HashString、HashStringAsHex、HashBytes、HashBytesAsHex、HashStream、HashStreamAsHex。好处是还可以指定文本编码
【讨论】:
Spring For Delphi 项目 - http://www.spring4d.org - 实现了许多 SHAxxx 哈希、MD5 哈希以及许多 CRC 函数
【讨论】:
如果您只想使用字典,而不是寻求安全性,那么:
在 Delphi 2009 及更高版本中,可以使用
BobJenkinsHash(Value, Length(Value) * SizeOf(Value), 0)
其中 Value 是一个字符串。
http://docwiki.embarcadero.com/VCL/en/Generics.Defaults.BobJenkinsHash
【讨论】:
您还可以将 WindowsCrypto API 与 Delphi 一起使用:
里面有一个封装所有 CryptoAPI 的单元。您还可以使用现在开源的 Lockbox。
最后,您可以使用 Delphi 支持几乎任何哈希算法。 Indy 示例可能是您在 Delphi 中最接近本机的示例,因为大多数版本的 Delphi 都包含 Indy。对于其余部分,您将需要使用库或编写更多代码来访问 CryptoAPI 或自己实现它。
【讨论】:
【讨论】:
使用 ICS,您只需调用位于 OverbytecsMD5 单元中的 StrMD5 函数。
除了那个特定的函数,还有很多其他数据类型和场景的 MD5 函数。还有其他的哈希方法,比如 SHA。
【讨论】: