-3

在为一个网站准备访问数据时,我突然意识到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?

4

2 回答 2

4

您从 PHP 脚本返回的 sha1

而是使用:

<?php
  $pwd = $_GET['pwd'];
  // echo $pwd . ' -> ';
  echo md5($pwd); 
?>
于 2013-01-22T20:05:36.070 回答
2

除了sha1在一个和另一个中使用之外,您在 Java 中调用时md5没有指定 a 。这可能导致不可预测的行为。指定类似的 UTF-8 将获得一致的结果,然后您可以在 PHP 中检查如何确保您使用 UTF-8 对字符串进行哈希处理。CharsetString.getBytes()Charset

于 2013-01-22T20:39:54.033 回答