![](/img/trans.png)
[英]How can I get a SQL Server md5 hash to match a previous php md5 hash?
[英]How to get the same MD5 with Delphi and PHP?
我正在使用带有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;
要么
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结果,无论字符是什么。
任何的想法?
例如:
用Delphi :
“:b15835f133ff2e27c7cb28117bfae8f4
':3590cb8af0bbb9e78c343b52b93773c9
用PHP :
“:3bd864034f446da13581129bb17f9191
':024c94d6e03b6f67a86b952b914816c7
正式化这个问题..我找到了答案......顺便说一句,我发布它,因为其他人可能有同样的问题......
"
和'
在PHP中被转义......所以,在Delphi中,我必须编码\\"
和\\'
...如果你认为我已经忘记了字符,或者如果你想添加一些细节,请不要犹豫......
德尔福就在这里。
>>> hashlib.md5('"').hexdigest()
'b15835f133ff2e27c7cb28117bfae8f4'
>>> hashlib.md5("'").hexdigest()
'3590cb8af0bbb9e78c343b52b93773c9'
PHP不应该需要默认转义的那些字符; 确保它配置为不这样做。
PHP hash
函数完美地实现了MD5。
以下PHP:
$md5 = hash("md5", "\"");
echo "\": ", $md5, "<br/>";
$md5 = hash("md5", "'");
echo "': ", $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代码的输入不同的输入。 如果您同时输入相同的输入,您将获得相同的输出。
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完全相同。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.