2013-01-22 2 views
-3

웹 사이트에 대한 액세스 데이터를 준비하면서 갑자기 Java에서 생성 된 MD5 암호화 된 암호가 PHP MD5에서 생성 된 것과 동일하지 않다는 사실을 알고있었습니다. 여기 및 다른 곳에서 게시 된 내용을 살펴보면 Java에서 여러 가지 솔루션을 발견하여 PHP와 정확히 동일한 결과를 얻을 수 있음을 확인했지만 모든 Java 구현은 동일한 결과를 제공하지만 PHP와는 완전히 다른 결과를 제공합니다.Java MD5와 PHP MD5가 완전히 다른 결과를 제공하는 이유는 무엇입니까?

그래서 저는 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 개의 char입니까? 당신의 PHP 스크립트

에서

+2

'sha1'은'md5'가 아닙니다. – datasage

+5

자바 코드가 MD5를 사용하는 동안 PHP 코드가 SHA1 해시 알고리즘을 사용하는 것처럼 보입니다. –

+0

출력의 길이 *에 유의하십시오. SHA-1은 160 비트, 20 바이트, 40 개의 16 진 문자입니다. MD5 128 비트, 16 비트, 32 진수 문자. –

답변

4

귀하의 반환 SHA1 대신 사용

<?php 
    $pwd = $_GET['pwd']; 
    // echo $pwd . ' -> '; 
    echo md5($pwd); 
?> 
2

다른 하나와 md5sha1를 사용 외에 당신이 자바 String.getBytes()를 호출 할 때, 당신은 Charset을 지정하지 않는 것입니다. 이로 인해 예기치 않은 동작이 발생할 수 있습니다. UTF-8과 같은 Charset을 지정하면 일관된 결과를 얻고 PHP에서 UTF-8로 문자열을 해싱하는지 확인하는 방법을 확인할 수 있습니다.

+0

항상 문자 인코딩을 지정해야합니다. 그러나 당신이하지 않으면 나는 그것을 예측할 수 없다고 부르지 않을 것입니다. 문자 인코딩을 지정하지 않으면 시스템의 기본 문자 인코딩이 사용됩니다. PHP가 사용하는 것과 다른 점이 있다면 그 결과는 분명히 다를 것입니다. – Jesper

+0

결과를 해시 함수에 연결하고 매번 동일한 출력을 얻으려는 경우 인코딩을 지정하지 않는 선의의 버그라고 부릅니다. –

관련 문제