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

Whi*_*ler 8 php delphi md5 delphi-xe2 firemonkey

我正在使用带有FireMonkey的Delphi XE2.

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

function MD5(const text: string) : string;
var
  md5 : TIdHashMessageDigest5;
begin
  md5    := TIdHashMessageDigest5.Create;
  Result := LowerCase(md5.HashStringAsHex(text, TEncoding.ANSI));
  md5.Free;
end;
Run Code Online (Sandbox Code Playgroud)

要么

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;
Run Code Online (Sandbox Code Playgroud)

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

$md5 = md5($toencode);
$md5 = hash("md5", $toencode);
Run Code Online (Sandbox Code Playgroud)

但是如果我使用Delphi或PHP,结果是不同的,当我请求其中一个字符的MD5时:"或者' 可能有其他字符产生不同的结果但我只是在测试期间找到这些字符...

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

所以,我不明白为什么我与它们中的一些("')存在差异,而且我想知道是否有一种方法可以始终从Delphi生成PHP MD5结果,无论字符是什么.

任何的想法?

例如:

Delphi:

":b15835f133ff2e27c7cb28117bfae8f4

':3590cb8af0bbb9e78c343b52b93773c9

PHP:

":3bd864034f446da13581129bb17f9191

':024c94d6e03b6f67a86b952b914816c7

正式化这个问题..我找到了答案......顺便说一句,我发布它,因为其他人可能有同样的问题......

"并且'在PHP中转义...所以,在Delphi中,我必须编码\"并且\'...如果您认为我忘记了字符或者如果您想添加一些细节,请不要犹豫......

Ign*_*ams 6

德尔福就在这里.

>>> hashlib.md5('"').hexdigest()
'b15835f133ff2e27c7cb28117bfae8f4'
>>> hashlib.md5("'").hexdigest()
'3590cb8af0bbb9e78c343b52b93773c9'
Run Code Online (Sandbox Code Playgroud)

PHP不应该需要默认转义的那些字符; 确保它配置为不这样做.


Dav*_*nan 3

PHPhash函数完美地实现了MD5。

以下 PHP:

$md5 = hash("md5", "\"");
echo "\":&nbsp;&nbsp;", $md5, "<br/>";
$md5 = hash("md5", "'");
echo "':&nbsp;&nbsp;", $md5, "<br/>";
$md5 = hash("md5", "\\\"");
echo "\\\": ", $md5, "<br/>";
$md5 = hash("md5", "\\'");
echo "\\': ", $md5, "<br/>";
Run Code Online (Sandbox Code Playgroud)

结果是这样的输出:

“:b15835f133ff2e27c7cb28117bfae8f4
': 3590cb8af0bbb9e78c343b52b93773c9
\“:3bd864034f446da13581129bb17f9191
\':024c94d6e03b6f67a86b952b914816c7

因此,前两个值是您从 Delphi 代码中获得的值,以及 Ignacio 从 Python 中获得的值。因此,绝对没有理由相信 PHP MD5 代码有错误。下面的两个值是 PHP 代码返回的值。

这让我们得出结论,您为 Delphi 代码提供的输入与为 PHP 代码提供的输入不同。如果你给它们提供相同的输入,你将得到相同的输出。