如何使用Delphi散列字符串?

如何使用Delphi散列字符串?,delphi,hash,cryptography,md5,Delphi,Hash,Cryptography,Md5,如何使用Delphi对字符串进行MD5哈希?如果需要MD5摘要并安装了组件,可以执行以下操作: uses SysUtils, IdGlobal, IdHash, IdHashMessageDigest; with TIdHashMessageDigest5.Create do try Result := TIdHash128.AsHex(HashValue('Hello, world')); finally Free; end; 最流行的算法在以下方面受支持: 哈弗 MD4

如何使用Delphi对字符串进行MD5哈希?

如果需要MD5摘要并安装了组件,可以执行以下操作:

uses SysUtils, IdGlobal, IdHash, IdHashMessageDigest;

with TIdHashMessageDigest5.Create do
try
    Result := TIdHash128.AsHex(HashValue('Hello, world'));
finally
    Free;
end;
最流行的算法在以下方面受支持:

  • 哈弗
  • MD4,MD5
  • RipeMD-128,RipeMD-160
  • SHA-1、SHA-256、SHA-384、SHA-512、
  • 老虎
更新
DCPCrypt
现在由维护,可以找到源代码。

您也可以将WindowsCrypto API与Delphi一起使用:

其中有一个单元封装了所有CryptoAPI。您还可以使用Lockbox,它现在是开源的

最终,您可以使用Delphi支持几乎任何哈希算法。Indy示例可能是您在Delphi中最接近本机的示例,因为Indy包含在大多数版本的Delphi中。对于其余部分,您需要使用库或编写更多代码来访问CryptoAPI或自己实现它。

我通常使用David Barton()提供的DCPCrypt2()

它还包含以下加密算法:

  • 河豚
  • 铸造128
  • 演员阵容256
  • DES,3DES
  • 冰,薄冰,冰2
  • 意念
  • 火星
  • 薄雾
  • RC2、RC4、RC5、RC6
  • Rijndael(新AES)
  • 双鱼
更新
DCPCrypt
现在由维护,可以找到源代码。

如果您只想使用字典,而不想寻找安全性,那么:
在Delphi 2009及更高版本中,可以使用

(值,长度(值)*SizeOf(值),0)

其中Value是字符串

支持:

  • MD-5
  • SHA-1和
  • 整个SHA-2系列,包括最近发布的SHA-512/224和SHA-512/256哈希

如果您想要一个MD5哈希字符串作为十六进制,并且您已经安装了Delphi XE 1,因此您有Indy 10.5.7组件,您可以执行以下操作:

uses SysUtils, IdGlobal, IdHash, IdHashMessageDigest;

with TIdHashMessageDigest5.Create do
try
    Result := TIdHash128.AsHex(HashValue('Hello, world'));
finally
    Free;
end;
使用IdGlobal、IdHash、IdHashMessageDigest


Spring For Delphi项目--实现了许多SHAXX哈希、MD5哈希以及许多CRC函数

这是对devstopfix答案的修改,已被接受

在当前的Indy版本中,您可以更轻松地散列字符串和流。例如:

function MD5String(str: String): String;
begin
  with TIdHashMessageDigest5.Create do
    try
      Result := HashStringAsHex(str);
    finally
      Free;
    end;
end;

使用
HashString
HashStringAsHex
HashBytes
hashbyteashex
HashStreamAsHex
。优点是,您还可以使用ICS指定文本编码,只需调用位于OverbytecsMD5单元中的StrMD5函数即可


除了这个特定的函数之外,还有更多用于其他数据类型和场景的MD5函数。还有其他散列方法,如SHA。

为什么不使用RTL中的
system.hash
单元,它还包含自Delphi西雅图以来MD5的散列算法

MD5HashCode := THashMD5.GetHashString(ClearTextString);

请记住,MD5和128位散列仅在Indy 9中。他们从Indy 10中删除了这些。你说的是IdHashMessageDigest.pas?它仍然在那里,至少在D2006中它在Indy10目录中。使用Indy散列文件时要非常小心。不幸的是,Indy在进行散列时将整个文件加载到内存中。对于几GB的文件,这会导致内存不足崩溃。要绕过它们,您需要使用一个非Indy哈希函数,该函数可以读取小块文件。如果您安装了Delphi XE 1,那么您就安装了Indy 10.5.7组件,请参阅下面的答案。请注意,这不是一个加密哈希函数(这意味着,对于哈希表之类的函数可以,但不要将其用于数据签名之类的函数)。作为补充说明,从Delphi2009开始,Delphi中的所有对象都有一个GetHashCode方法。一个在你的主题中,另一个在你的描述中。因为11年前,这个单元不存在对于使用更现代的Delphi版本的人来说,这是一个很好的提示。这一版本似乎比Indy和System.Hash快30-40%,同时为项目添加了最少的代码。