2010-06-02 5 views
-1

나는 기존의 JSP 프로그램의 PHP 버전을 만들려고 노력하고있다. 그러나 나는 암호 암호화 부분에 머물러있다.java에서 php로 비밀번호 암호화 변환

변환 방법을 알려주세요. 나는 그것이 md5()를 얻으려고 노력하는 것을 알고있다. 그러나 그 후 나는 그것을 얻지 않는다. 나는 Stringbuffer와 for() 부분에서 길을 잃는다.

나를 도와 줄 수 있습니까?

public static String encryptPassword(String password) 
{ 
    String encrypted = ""; 
    try 
    { 
     MessageDigest digest = MessageDigest.getInstance("MD5"); 
     byte[] passwordBytes = password.getBytes(); 

     digest.reset(); 
     digest.update(passwordBytes); 
     byte[] message = digest.digest(); 

     StringBuffer hexString = new StringBuffer(); 
     for (int i=0; i < message.length; i++) 
     { 
      hexString.append(Integer.toHexString(
       0xFF & message[ i ])); 
     } 
     encrypted = hexString.toString(); 
    } 
    catch(Exception e) { } 
    return encrypted; 
} 
+1

그냥 (이미 알고 계실 것입니다.) 암호화가 아니므로 해시입니다. :) –

+0

그렇습니다. 나는 왜이 함수가 encryptPassword라고 불리는 지 궁금합니다. P – Obay

+0

@Obay 질문 제목에서 : "password encryption". – zaph

답변

3

이라 클리스가 있어야한다 권리. md5()은 기본적으로 16 진수로 인코딩 된 출력 문자열을 제공합니다. 선택적인 $raw_output 인수에 대해 TRUE을 전달하여 Java와 같이 인코딩되지 않은 바이트 만 가져옵니다.

길이는 다음 Java 코드가 버그가 29 일부터 32

에 이르기까지 다양합니다. MD5 해시는 항상 128 비트 (32 진수)입니다. 여기있다 :

hexString.append(Integer.toHexString(0xFF & message[ i ])); 

이 당신이 저장 한 것은 원래의 MD5 값을 복구 할 수없는 난도질 해시이다 (16) 아래의 모든 바이트 1 대신 01를 생성합니다. 당신이 절대적으로이 깨진 데이터를 유지해야하는 경우 PHP의 버그를 재현해야합니다 :

function makeBrokenMD5($s) { 
    $hash= md5($s, TRUE); 
    $bytes= preg_split('//', $hash, -1, PREG_SPLIT_NO_EMPTY); 
    $broken= ''; 
    foreach ($bytes as $byte) 
     $broken.= dechex(ord($byte)); 
    return $broken; 
} 
+0

bobince, spot on, 그냥 깨진 자바 해시를 생산 테스트했습니다. – Iraklis

1

MD5 해시를 문자의 최소 significan 바이트의 문자열 16 진수 숫자로 변환합니다. Java에서 모든 문자는 2 바이트입니다.

실제로 이것은 ASCII 값을 의미합니다.

+0

PHP에서 정확히 무엇을 의미합니까? 그것은 md5()를 호출 한 다음 md5에서 생성 된 각 문자에 ord()를 호출합니까? – Obay

+0

bin2hex (md5 (password, true))가 가까워 야합니다. –

1
<?php 
$password = "MyPass"; 
$hash = md5($password); 
?> 

UPDATE : 는 두 버전 사이에 약간의 차이가 있습니다. 이 answer.Here @bobince 참조 해결하려면 테스트 코드입니다 : PHP

자바

package tests; 

import java.security.MessageDigest; 

/** 
* Created by IntelliJ IDEA. 
* User: Iraklis 
* Date: 2 Ιουν 2010 
* Time: 2:15:03 μμ 
* To change this template use File | Settings | File Templates. 
*/ 
public class Md5Test { 
    public static String encryptPassword(String password) { 
     String encrypted = ""; 
     try { 
      MessageDigest digest = MessageDigest.getInstance("MD5"); 
      byte[] passwordBytes = password.getBytes(); 

      digest.reset(); 
      digest.update(passwordBytes); 
      byte[] message = digest.digest(); 

      StringBuffer hexString = new StringBuffer(); 
      for (int i = 0; i < message.length; i++) { 
       hexString.append(Integer.toHexString(
         0xFF & message[i])); 
      } 
      encrypted = hexString.toString(); 
     } 
     catch (Exception e) { 
     } 
     return encrypted; 
    } 

    public static void main(String[] args) { 
     System.out.println("Pass1 md5 = " + encryptPassword("Test123FORXTREMEpass")); 
     System.out.println("Pass1 md5 = " + encryptPassword("Ijdsaoijds")); 
     System.out.println("Pass1 md5 = " + encryptPassword("a")); 
     System.out.println("Pass1 md5 = " + encryptPassword(" ")); 
    } 

} 


Output: 
Pass1 md5 = dc3a7b42a97a3598105936ef22ad2c1 
Pass1 md5 = df7ca542bdbf7c4b8776cb21c45e7eef 
Pass1 md5 = cc175b9c0f1b6a831c399e269772661 
Pass1 md5 = 7215ee9c7d9dc229d2921a40e899ec5f 

<?php 
echo "Pass1 md5 = ".md5("Test123FORXTREMEpass")."<BR>"; 
echo "Pass2 md5 = ".md5("Ijdsaoijds")."<BR>"; 
echo "Pass3 md5 = ".md5("a")."<BR>"; 
echo "Pass4 md5 = ".md5(" ")."<BR>"; 
?> 

출력 :

Pass1 md5 = dc3a7b42a97a35981059036ef22ad2c1 
Pass2 md5 = df7ca542bdbf7c4b8776cb21c45e7eef 
Pass3 md5 = 0cc175b9c0f1b6a831c399e269772661 
Pass4 md5 = 7215ee9c7d9dc229d2921a40e899ec5f 
+0

데이터베이스에서 생성 된 암호를 확인했기 때문에 md5()가 아닌 것 같습니다. 32 문자가 아닙니다. 길이는 29에서 32까지입니다. – Obay

+0

Java 출력이 분명히 잘못되었습니다. 일부 '0'이 누락되었습니다. – bobince

+0

dude, pass1 및 pass3은 동일하지 않습니다. java의 pass1이 하나의 0을 제거했습니다. java의 pass3이 첫 번째 0을 제거했습니다. – Obay

0

는 모두 자바에서 동일한 결과를 얻으려면 및 PHP는 나는 이것을 사용했다.

자바 (는 "시도"블록 내부의 메소드를 호출해야합니다) :

public static String getHash(String pass) throws Exception 
{ 
    MessageDigest md=MessageDigest.getInstance("MD5"); 
    md.update(pass.getBytes(),0,pass.length()); 
    return new BigInteger(1,md.digest()).toString(16); 
} 

PHP :

<?php 
echo md5(pass); 
?> 

희망이

편집을하는 데 도움이 : 자바 변형 반환하는 경우 31 문자는 32 문자를 반환하는 PHP 해시와 일치하도록 문자열 앞에 "0"을 추가합니다.