8

我将 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 ...

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

任何的想法?

例如:

德尔福

": b15835f133ff2e27c7cb28117bfae8f4

': 3590cb8af0bbb9e78c343b52b93773c9

使用PHP

": 3bd864034f446da13581129bb17f9191

': 024c94d6e03b6f67a86b952b914816c7

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

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

4

3 回答 3

6

德尔福就在这里。

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

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

于 2012-10-05T13:00:31.197 回答
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/>";

导致此输出:

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

因此,前两个值是您从 Delphi 代码中获得的值,与 Ignacio 从 Python 中获得的值相同。因此,绝对没有理由相信 PHP MD5 代码有问题。底部的两个值是您的 PHP 代码返回的值。

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

于 2012-10-05T13:53:33.437 回答
1
    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 相同。

于 2015-03-17T23:20:17.047 回答