MD5 Hashing in Delphi 2009

6 delphi unicode hash md5 delphi-2009

在borland delphi 7甚至在delphi 2007中一切正常,但在delphi 2009中它只返回错误的哈希!

我使用wcrypt2脚本(http://pastebin.com/m2f015cfd)

看看:

字符串:"123456"

哈希:

Delphi 7:"e10adc3949ba59abbe56e057f20f883e" - 真正的哈希.
Delphi 2007:"e10adc3949ba59abbe56e057f20f883e" - 真正的哈希.
并且......德尔福2009:"5fa285e1bebe0a6623e33afc04a1fbd5" - WTF ??

我已经尝试了很多md5脚本,但是delphi 2009对它们都做了同样的事情.有帮助吗?谢谢.

Jim*_*eth 30

您的库不支持Unicode.只是传递一个AnsiString是不够的,因为它可能在内部使用字符串来存储数据.

您可以尝试更新库,等待作者更新它,或者只是使用MessageDigest_5.pas附带德尔福2009年它在源\ WIN32 \肥皂\ wsdlimporter文件夹,您将需要以添加到您的路径,或明确地将其包含在您的项目中.

以下是Delphi 2009中使用它的一些示例代码:

uses Types, MessageDigest_5;

procedure TForm16.Edit1Change(Sender: TObject);
var
  MD5: IMD5;
begin
  MD5 := GetMD5;
  MD5.Init;
  MD5.Update(TByteDynArray(RawByteString(Edit1.Text)), Length(Edit1.Text));
  Edit2.Text := LowerCase(MD5.AsString);
end;
Run Code Online (Sandbox Code Playgroud)

你在做生意:

MD5(123456)= e10adc3949ba59abbe56e057f20f883e

如果你愿意,可以将它包装在一个简单的函数调用中.在转换为TByteDynArray之前强制转换为RawByteString是很重要的,因为RawByteString转换会丢弃所有额外的Unicode字符.如果编辑包含Unicode字符,那么您最终可能会收到错误的数据.

请记住,GetMD5正在返回一个接口,因此它是引用计数等.

圣诞节快乐!


小智 5

在有人评论散列算法之前,如果他们至少对基本概念和原则有基本的了解,那么它会有所帮助.所有迄今已集中在无尽的铸字的答复是完全矫枉过正,但更糟的是,会导致不可靠的结果,如果一个Unicode字符串被散列.

您需要了解的第一件事是散列和加密算法在字节级操作.这意味着他们不关心你正在散列或加密的内容.您可以散列整数,字符,纯ASCII,完整的unicode,字节,长字等等.算法并不关心.

当操作字符串,你必须确保的唯一事情是,你的散列库的内部功能中吐出的结果散列函数返回AnsiString类型.而已.这一切都很重要.

您的项目的实际代码可以(并且应该)基于正常的字符串输入,该输入映射到Delphi 2009中的unicodestring.您不应该对ansistring或rawbytestring进行类型转换.通过这样做,当用户尝试散列ANSI字符集范围之外的任何内容时,您立即创建一个损坏的哈希.在哈希的世界中,破碎的哈希既不可靠又不安全.


Mih*_*șan 0

您是否可能将通用字符串(在 Delphi 2009 中是 UnicodeString)转换为 PAnsiChar 并将其传递到哈希函数中?这是行不通的。您首先必须将字符串转换为 AnsiString,然后将该字符串转换为 PAnsiChar,如下所示:

PAnsiChar(AnsiString('123456'))
Run Code Online (Sandbox Code Playgroud)

另外,尝试使用 RawByteString 而不是像 dmajkic 建议的 AnsiString 。避免使用 UTF8String,因为它不是 AnsiString,并且 ASCII 范围 (0..127) 之外的任何字符都可能会被重新解释为多字节字符。