-3

Web サイトのアクセスデータを作成しているときに、Java で作成された MD5 暗号化パスワードが PHP MD5 で作成されたものとまったく同じではないことに突然気付きました。ここや他の場所の投稿を見ると、Java で PHP とまったく同じ結果が得られることを保証するいくつかのソリューションが見つかりました。ただし、すべての Java 実装は、それらの間で同じ結果をもたらしますが、PHP によるものとはまったく異なる結果をもたらします。

そのため、PHP による変換のために同じパスワードをローカル サーバーに送信し、同時に Java を使用してそれ自体を変換する小さな 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 の結果が通常の 32 文字ではなく 40 文字になるのはなぜですか?

4

2 に答える 2

4

PHP スクリプトから返される sha1

代わりに使用:

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

sha1一方と他方で使用する以外に、Java で呼び出すときにmd5a を指定していません。これにより、予期しない動作が発生する可能性があります。like UTF-8 を指定すると、一貫した結果が得られます。その後、PHP で、文字列を UTF-8 でハッシュする方法を確認できます。CharsetString.getBytes()Charset

于 2013-01-22T20:39:54.033 に答える