2014-07-14 1 views
4
나는 단순히 소금 PHP에서 해시 수

:PHP에서 salt와 똑같은 해싱을 사용합니까? (SHA-256)

$orig_pw = "abcd"; 
$salt = 5f8f041b75042e56; 
$password = hash('sha256', $orig_pw . $salt); 

(. 이것은 내가 그것을 구현하는 방법 아니다, 이것은 단지 예입니다 소금은 개인에 따라 다릅니다)

그리고

bc20a09bc9b3d3e1fecf0ed5742769726c93573d4133dbd91e2d309155fa9929 

하지만 자바에서 동일한 작업을 시도하면, 나는 다른 결과를 얻을 :이, 저장된 암호입니다.

public byte[] getHash(String password, byte[] salt) throws NoSuchAlgorithmException { 
     MessageDigest digest = MessageDigest.getInstance("SHA-256"); 
     digest.reset(); 
     digest.update(salt); 
     try { 
      return digest.digest(password.getBytes("UTF-8")); 
     } catch (UnsupportedEncodingException e) { 
      e.printStackTrace(); 
     } 
     return null; 
    } 


public byte[] hexStringToByteArray(String s) { 
     int len = s.length(); 
     byte[] data = new byte[len/2]; 
     for (int i = 0; i < len; i += 2) { 
      data[i/2] = (byte) ((Character.digit(s.charAt(i), 16) << 4) 
           + Character.digit(s.charAt(i+1), 16)); 
     } 
     return data; 
    } 

결과는 다음과 같습니다 : 진수로 코딩

/¬1¶ĆĽëüFd?[$?¶»_9ËZ»ç¶S‘Ęŗש 

는 꿈에도되지 않습니다 :

2fac31b6434c14ebfc46643f5b243fb6bb5f39cb5abb10e7b65391454c97d7a90d0a 
나는 String password = "abcd";

byte[] salt = hexStringToByteArray("5f8f041b75042e56"); 

try { 
    System.out.println(new String(getHash(password, salt))); 
} catch (NoSuchAlgorithmException e1) { 
    e1.printStackTrace(); 
} 

그리고 두 가지 방법을 시도

수있는 사람 h 이것으로 엘프?

hash('sha256', $salt . $orig_pw); 

그래서 해시 소금이 교환됩니다

답변

6

스왑 된 것 외에도 PHP에서는 소금 값을 리터럴 문자열로 취급하고 Java에서는 소금의 16 진수 변환을 먼저 수행 한 다음 결과 바이트는 MessageDigest을 업데이트합니다. 이것은 분명히 다른 결과를 낳을 것입니다. > 바이트 (문자) - -> SHA-256
자바 소금 : 소금 - 바이트> (unhex) -> SHA-256

PHP : 오직 소금을 보면 방금 Java 코드를 사용해 보았습니다. 나는 또한 자바에서와 같은 PHP에서 동일한 값을 해시하려고 시도하고 그것은 나에게 동일한 결과를 줬다.

는 PHP 코드에

자바 동등한은 다음과 같습니다

String password = "abcd"; 
String salt = "5f8f041b75042e56"; 

try { 
    MessageDigest digest = MessageDigest.getInstance("SHA-256"); 

    return digest.digest((password + salt).getBytes("UTF-8")); 
} catch (UnsupportedEncodingException | NoSuchAlgorithmException e) { 
    return null; 
} 

을은 다음과 같은 결과를 반환 바이트 hexing 후 :

60359BC8A0B09898335AA5A037B1E1B9CE3A1FE0D4CEF13514901FB32F3BCEB0 

그리고 PHP에서

일 :

<? 
echo hash('sha256', "abcd"."5f8f041b75042e56"); 
?> 

을 똑같은 것을 반환합니다.

+0

나는 모든 단어를 이해하지 못한다 (영어가 아님). 그래서 자바에서 소금을 바꿔야합니까? (예 : byte [] salt = "5f8f041b75042e56".getBytes();) 또한 자바에서 어떻게 바꿀 수 있습니까? – RuntimeException

+0

실제 PHP 코드가 어떻게 생겼는지 모르겠습니다. 게시 된 코드는 노출 된 16 진수 문자열 때문에 실행되지 않습니다. 그러나 당신은 "abcd"를 해시 한 것 같습니다. "5f8f041b75042e56"'. Java에서 해당 기능을 수행하려면'("password"+ "salt"). getBytes ("UTF-8")'을 수행 한 다음이를 소화해야합니다. –

+0

코드를 사용하여 죄송합니다. 구현 방법이 아닙니다. 실제 코드는 난수를 얻습니다 : $ salt = dechex (mt_rand (0, 2147483647)). dechex (mt_rand (0, 2147483647)); – RuntimeException

2

나는

digest.update(salt); 
digest.digest(password.getBytes("UTF-8")); 

가 상당하다고 생각합니다. 이거 확인할 수 있니?

+0

네, 그들은 바꿔 놓았습니다. (가능한 경우 그대로 유지하십시오.) – RuntimeException

+0

그냥 바꾸면 안되며, 입력은 PHP와 Java에서 동일해야합니다. – Halcyon

+0

나는 그것이 PHP에서 스왑을 유지하고 자바에서도 교환을 의미. – RuntimeException

관련 문제