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

时间:2012-10-05 12:57:10

标签: php delphi md5 delphi-xe2 firemonkey

我正在使用Delphi XE2 和FireMonkey。

我已经阅读了很多关于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;

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中的经常相同:

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

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

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

所以,我不明白为什么我与他们中的一些("')存在差异,我想知道是否有办法始终生成PHP MD5结果来自德尔福,无论是什么角色。

有什么想法吗?

  

例如:

     

使用 Delphi

     

“:b15835f133ff2e27c7cb28117bfae8f4

     

':3590cb8af0bbb9e78c343b52b93773c9

     

PHP

     

“:3bd864034f446da13581129bb17f9191

     

':024c94d6e03b6f67a86b952b914816c7

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

"'在PHP中转义...因此,在Delphi中,我必须编码\"\' ...如果您认为我已经忘记了如果您想添加一些细节,请不要犹豫......

3 个答案:

答案 0 :(得分:6)

Delphi就在这里。

>>> hashlib.md5('"').hexdigest()
'b15835f133ff2e27c7cb28117bfae8f4'
>>> hashlib.md5("'").hexdigest()
'3590cb8af0bbb9e78c343b52b93773c9'

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

答案 1 :(得分:3)

PHP hash函数完美地实现了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/>";

导致此输出:

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

因此,前两个值是您从Delphi代码中获得的值,以及Ignacio从P​​ython获得的值。因此,绝对没有理由相信PHP MD5代码有问题。最底层的两个值是PHP代码返回的值。

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

答案 2 :(得分:0)

    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完全相同。