2011-02-15 4 views
3

나는 암호 암호화와 다른 편도 암호화 요구 사항을 위해 PHP에서 crypt 함수를 사용하는 것을 선호합니다. 지원되는 암호화 알고리즘을 사용할 수 있기 때문에 소금을 변경하면 몇 가지 장점이 있습니다. 일반적으로 나는 소금을 사용하지 않고 무작위로 MD5 소금을 사용합니다. 이 암호화 문자열을 데이터베이스에 암호 해시로 저장하고 사용자를 인증하는 동안이 암호를 암호화 함수에 소금으로 사용합니다. 그것은 PHP에서 잘 작동합니다. 그러나 함수의 PHP 부분에서 crypt 함수를 사용하는 동안 다른 프로그래밍 언어가 필요하면 해시를 만들 때 문제가 발생했습니다.crypt 함수로 md5 해시를 만드는 방법은 crypt 함수가 아닌 md5 함수를 사용하여 md5 salt로 생성합니까?

MD5 해시를 생성하는 간단한 방법 (PHP md5() 함수 또는 기타 사용)이 MD5 salt를 사용하는 동안 crypt 함수가 생성하는 것과 유사 할 필요가 있는지 알고 싶습니다. 크립트 기능을 사용하지 않고 PHP로 어떻게 작동하는지 이해할 수 있다면 다른 프로그래밍 언어로 구현할 가능성이 있습니다.

답변

0

여기에 동일한 기능을 구현하는 code in Java이 있습니다. 이렇게하면 다른 언어에서도 같은 결과를 얻을 수 있습니다.

echo 'MD5:   ' . crypt('mypassword', '$1$somesalt$') . "\n"; 
    echo 'MD5:   ' . mycrypt('mypassword', 'somesalt') . "\n"; 

    function to64($s, $n) 
    { 
     $i64 = "./ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; 
     $r = ''; 
     while (--$n >= 0) { 
      $ss = $s & 0x3f; 
      $r .= $i64[$s & 0x3f]; 
      $s >>= 6; 
     } 
     return $r; 
    } 

    function mycrypt($v, $s) { 
      $m = hash_init("md5"); 
      hash_update($m, $v); 
      hash_update($m, '$1$'); 
      hash_update($m, $s); 

      $m1 = hash_init("md5"); 
      hash_update($m1, $v); 
      hash_update($m1, $s); 
      hash_update($m1, $v); 
      $final = hash_final($m1, true); 
      for ($pl = strlen($v); $pl>0; $pl-=16) { 
        hash_update($m, substr($final, 0, $pl > 16? 16:$pl)); 
      } 
      $final = "\0"; 
      for($i=strlen($v);$i!=0;$i>>=1) { 
        if (($i & 1) != 0) { 
          hash_update($m, $final); 
        } else { 
          hash_update($m, $v[0]); 
        } 
      } 
      $final = hash_final($m, true); 
      for($i=0;$i<1000;$i++) { 
       $m1 = hash_init("md5"); 

       if(($i&1)) { 
        hash_update($m1, $v); 
       } else { 
        hash_update($m1, $final); 
       } 
       if(($i%3)) { 
        hash_update($m1, $s); 
       } 
       if(($i%7)) { 
        hash_update($m1, $v); 
       } 
       if(($i&1)) { 
        hash_update($m1, $final); 
       } else { 
        hash_update($m1, $v); 
       } 
       $final = hash_final($m1, true); 
      } 
      $l = '$1$'.$s.'$'; 
      $l .= to64(ord($final[ 0])<<16 | (ord($final[ 6])<<8) | ord($final[12]), 4); 
      $l .= to64(ord($final[ 1])<<16 | (ord($final[ 7])<<8) | ord($final[13]), 4); 
      $l .= to64(ord($final[ 2])<<16 | (ord($final[ 8])<<8) | ord($final[14]), 4); 
      $l .= to64(ord($final[ 3])<<16 | (ord($final[ 9])<<8) | ord($final[15]), 4); 
      $l .= to64(ord($final[ 4])<<16 | (ord($final[10])<<8) | ord($final[ 5]), 4); 
      $l .= to64(ord($final[11]), 2); 

      return $l; 
    } 
:

PHP를 들어

,이 코드를 조사 할 수 있습니다