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中,我必须对"和\\'进行编码...如果您认为我忘记了字符或想要添加一些字符详细信息,请不要犹豫...
- 您可以在MD5ing之前在PHP中运行反斜杠
-
是的...但是..; o)我正在访问无法访问代码的远程服务器...
-
PHP转义了引号,双引号,反斜杠和'NUL'(我猜这是Delphi中的#0),请参见php.net/manual/en/security.magicquotes.what.php
-
@StijnSanders:Thx了解详细信息和链接
-
您不是在字符串上计算哈希,而是在二进制数据上计算。现在去某个地方,写下来100次。
-
@JeroenWiertPluimers:我同意你的看法,但是当一个API要求MD5密码...才能使用该API ...您需要做出一些让步;)
-
然后,您必须确保密码在两侧均以相同的二进制方式编码。那就是你问题的症结所在。 MD5的唯一相关之处在于它表明您编码错误。在这种情况下:因为您逃避了本不该做的事情。
Delphi在右边。
1 2 3 4
| >>> hashlib .md5('"').hexdigest ()
'b15835f133ff2e27c7cb28117bfae8f4'
>>> hashlib .md5("'").hexdigest ()
'3590cb8af0bbb9e78c343b52b93773c9' |
PHP默认不需要转义那些字符;确保将其配置为不这样做。
- @戴维:我这就是为什么我怀疑这些字符被不必要地"转义了"。
-
@ IgnacioVazquez-Abrams实际上这是一个非常奇怪的转义。不像我猜到的那样转义URL。
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代码不同。如果将它们都输入相同的输入,则将获得相同的输出。
-
是的。我的问题... @StijnSanders的网址向我解释了原因...我的测试错误,原因是从form填充的变量被损坏(自动使用反斜杠转义)。
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相同。