如何用Delphi和PHP获得相同的MD5?

How to get the same MD5 with Delphi and PHP?

我正在将Delphi XE2与FireMonkey一起使用。

我已经阅读了许多其他有关MD5的问题,但没有找到我所遇到问题的答案...
我还测试了从Delphi生成MD5的不同脚本:

1
2
3
4
5
6
7
8
function MD5(const text: string) : string;
var
  md5 : TIdHashMessageDigest5;
begin
  md5    := TIdHashMessageDigest5.Create;
  Result := LowerCase(md5.HashStringAsHex(text, TEncoding.ANSI));
  md5.Free;
end;

1
2
3
4
5
6
7
8
9
function MD5(const text: String) : string;
var
  md5: IMD5;
begin
  md5:= GetMD5;
  md5.Init;
  md5.Update(TByteDynArray(RawByteString(AnsiString(text))), Length(AnsiString(text)));
  Result := LowerCase(md5.AsString);
end;

两者都给我相同的结果...这在PHP中通常是相同的:

1
2
$md5 = md5($toencode);
$md5 = hash("md5", $toencode);

但是当我使用Delphi或PHP时,当我请求以下字符之一的MD5时,结果是不同的:"'
也许还有其他字符会产生不同的结果,但是我只是在测试过程中发现了这些结果...

我已经测试了许多扩展的ASCII字符,并且具有相同的MD5 ...

所以,我不明白为什么我与其中的几个("')之间存在差异,并且我想知道是否有一种方法可以始终从Delphi生成PHP MD5结果,无论如何字符是

有什么想法吗?

For instance:

with Delphi:

": b15835f133ff2e27c7cb28117bfae8f4

': 3590cb8af0bbb9e78c343b52b93773c9

with PHP:

": 3bd864034f446da13581129bb17f9191

': 024c94d6e03b6f67a86b952b914816c7

使这个问题正式化..我已经找到了答案...顺便说一句,我将其发布为其他人可能遇到的相同问题...

"'在PHP中被转义了...因此,在Delphi中,我必须对"\\'进行编码...如果您认为我忘记了字符或想要添加一些字符详细信息,请不要犹豫...


Delphi在右边。

1
2
3
4
>>> hashlib.md5('"').hexdigest()
'b15835f133ff2e27c7cb28117bfae8f4'
>>> hashlib.md5("'").hexdigest()
'3590cb8af0bbb9e78c343b52b93773c9'

PHP默认不需要转义那些字符;确保将其配置为不这样做。


PHP hash函数很好地实现了MD5。

以下PHP:

1
2
3
4
5
6
7
8
$md5 = hash("md5",""");
echo"
":", $md5,"<br/>";
$md5 = hash("md5","'");
echo"':", $md5,"<br/>";
$md5 = hash("md5","\\\"");
echo"\\\":", $md5,"<br/>";
$md5 = hash("md5","\\\'");
echo"\\\':", $md5,"<br/>";

结果输出:

1
2
3
4
":  b15835f133ff2e27c7cb28117bfae8f4
':  3590cb8af0bbb9e78c343b52b93773c9
"
: 3bd864034f446da13581129bb17f9191
\': 024c94d6e03b6f67a86b952b914816c7

因此,最上面的两个值是您从Delphi代码中获得的值,以及与Ignacio从P??ython获得的值相同的值。因此,绝对没有理由相信PHP MD5代码有问题。最下面的两个值是您的PHP代码返回的值。

让我们得出的结论是,您输入的Delphi代码与您输入的PHP代码不同。如果将它们都输入相同的输入,则将获得相同的输出。


1
2
3
4
5
6
7
8
9
10
11
12
13
    uses IdHashMessageDigest;

    function MD5(const texto:string):string;
    var
      idmd5 : TIdHashMessageDigest5;
    begin
      idmd5 := TIdHashMessageDigest5.Create;
      try
        result := idmd5.HashStringAsHex(UTF8Encode(texto));
      finally
        idmd5.Free;
      end;
    end;

要完全相同,请使用LowerCase(MD5('1234'));,这与PHP MD5相同。