【问题标题】:How do I hash a string with Delphi?如何用 Delphi 散列一个字符串?
【发布时间】:2023-03-31 10:09:02
【问题描述】:

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

【问题讨论】:

  • 附带说明,从 Delphi 2009 开始,Delphi 中的所有对象都有一个 GetHashCode 方法。
  • 您在问两个不同的问题。一个在您的主题中,另一个在您的描述中。

标签: delphi hash cryptography md5


【解决方案1】:

如果您想要一个 MD5 摘要并安装了Indy 组件,您可以这样做:

uses SysUtils, IdGlobal, IdHash, IdHashMessageDigest;

with TIdHashMessageDigest5.Create do
try
    Result := TIdHash128.AsHex(HashValue('Hello, world'));
finally
    Free;
end;

Delphi Cryptography Package 支持最流行的算法:

  • 哈弗
  • MD4, MD5
  • RipeMD-128,RipeMD-160
  • SHA-1、SHA-256、SHA-384、SHA-512,
  • 老虎

更新 DCPCrypt 现在由 Warren Postma 维护,源代码可以在 here 找到。

【讨论】:

  • 请记住 MD5 和 128 位哈希仅在 Indy 9 中。他们从 Indy 10 中删除了这些。
  • 你说的是IdHashMessageDigest.pas?它还在那里,至少在 D2006 中它在 Indy10 目录中。
  • 使用 Indy 散列文件时要非常小心。不幸的是,Indy 将整个文件加载到内存中,就像它执行哈希一样。对于几 GB 的文件,这会导致内存不足崩溃。要绕过它们,您需要使用可以读取小块文件的非 Indy 哈希。
  • 如果你安装了 Delphi XE 1,那么你有 Indy 10.5.7 组件,请看下面我的回答。
【解决方案2】:

如果您希望 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;

【讨论】:

    【解决方案3】:

    我通常使用 David Barton (City in the Sky) 的 DCPCrypt2 (Delphi Cryptography Package)。

    它还包含以下加密算法:

    • 河豚
    • 演员表 128
    • 演员表 256
    • DES、3DES
    • 冰,薄冰,Ice2
    • 想法
    • 火星
    • 迷雾1
    • RC2、RC4、RC5、RC6
    • Rijndael(新的 AES)
    • 两条鱼

    更新 DCPCrypt 现在由 Warren Postma 维护,源代码可以在 here 找到。

    【讨论】:

      【解决方案4】:

      为什么不使用 RTL 的 system.Hash 单元,它还包含自 Delphi Seattle 以来的 MD5 哈希算法?

      MD5HashCode := THashMD5.GetHashString(ClearTextString);
      

      【讨论】:

      • 因为 11 年前,这个单位还不存在。 ;-) 不过对于使用更现代的 Delphi 版本的人来说,这是一个很好的提示。
      【解决方案5】:

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

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

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

      使用HashStringHashStringAsHexHashBytesHashBytesAsHexHashStreamHashStreamAsHex。好处是还可以指定文本编码

      【讨论】:

        【解决方案6】:

        Spring For Delphi 项目 - http://www.spring4d.org - 实现了许多 SHAxxx 哈希、MD5 哈希以及许多 CRC 函数

        【讨论】:

          【解决方案7】:

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

          创建字符串的哈希值

          BobJenkinsHash(Value, Length(Value) * SizeOf(Value), 0)

          其中 Value 是一个字符串。

          http://docwiki.embarcadero.com/VCL/en/Generics.Defaults.BobJenkinsHash

          【讨论】:

          • 请注意,这不是一个 cryptographic 哈希函数(这意味着,它适用于哈希表等,但不要将其用于数据签名等) .
          【解决方案8】:

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

          里面有一个封装所有 CryptoAPI 的单元。您还可以使用现在开源的 Lockbox。

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

          【讨论】:

            【解决方案9】:

            TurboPower Lockbox 支持:

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

            【讨论】:

              【解决方案10】:

              使用 ICS,您只需调用位于 OverbytecsMD5 单元中的 StrMD5 函数。

              除了那个特定的函数,还有很多其他数据类型和场景的 MD5 函数。还有其他的哈希方法,比如 SHA。

              【讨论】:

              • 这个似乎比 Indy 和 System.Hash 快了将近 30-40%,同时为项目添加的代码最少。
              猜你喜欢
              • 2022-01-16
              • 2013-04-07
              • 2017-12-21
              • 1970-01-01
              • 2015-12-14
              • 2020-07-07
              • 2023-03-15
              • 1970-01-01
              • 2011-09-30
              相关资源
              最近更新 更多