在为网站准备访问数据时,我突然意识到Java创建的MD5加密密码与PHP MD5创建的密码完全不同。浏览这里和其他地方的帖子,我发现了Java中的几种解决方案,确保它们将提供与PHP完全相同的结果 - 但是所有Java实现在它们之间都提供相同的结果,但与PHP的结果完全不同。
因此,我编写了一个小型Java程序,将相同的密码发送到我的本地服务器以进行PHP转换,同时使用Java自行转换。这里的程序:
public PHPDriver() {
String pwd = "aabbccdd";
String p = encodeByPHP("http://localhost/testsite/md5.php?pwd=" + pwd);
System.out.println("PHPDriver: " + pwd + " -> " + p);
System.out.println("md5: " + pwd + " -> " + md5(p));
...
public String encodeByPHP(String url) {
try {
// create a link to a URL
URL urlAddress = new URL(url);
URLConnection link = urlAddress.openConnection();
BufferedReader inStream = new BufferedReader(new InputStreamReader(link.getInputStream()));
return inStream.readLine();
} catch (MalformedURLException e) {
...
public String md5(String input) {
String result = input;
try {
if(input != null) {
MessageDigest md = MessageDigest.getInstance("MD5"); //or "SHA-1"
md.update(input.getBytes());
BigInteger hash = new BigInteger(1, md.digest());
result = hash.toString(16);
while(result.length() < 32) {
result = "0" + result;
}
}
} catch (NoSuchAlgorithmException nsa) {
还有(非常复杂;-)PHP页面:
<?php
$pwd = $_GET['pwd'];
// echo $pwd . ' -> ';
echo sha1($pwd);
?>
其结果如下所示:
PHPDriver: aabbccdd -> 527bee2730bf234e9a78bde5af091ece9c6302d5
md5: aabbccdd -> ab86815613f7f321001efef1935dbe7d
这里出了什么问题?这是编码错误的问题吗?为什么 PHP 结果的长度为 40 个字符而不是通常的 32 个字符?
从 PHP 脚本返回的 sha1
而是使用:
<?php
$pwd = $_GET['pwd'];
// echo $pwd . ' -> ';
echo md5($pwd);
?>
除了在一个
中使用sha1
,在另一个中使用md5
之外,在 Java 中调用String.getBytes()
时,您没有指定Charset
。 这可能会导致不可预知的行为。 指定像 UTF-8 这样的Charset
将获得一致的结果,然后您可以在 PHP 中检查如何确保使用 UTF-8 对字符串进行哈希处理。