묻고답하기
page_full_width" class="col-xs-12" |cond="$__Context->page_full_width">
function_exists 에서 sha256, sha512 등 hash 함수 확인이 안되네요.
2015.01.31 12:03
비밀번호 해시 hash 저장 방법을
md5에서 sha512로 바꾸려고 시도중입니다.
서버 환경 :
리눅스
nginx 1.4.6
PHP Version 5.5.9
php 파일을 만들어서 일단 테스트를 해 보았는데요.
1 <!DOCTYPE html> 2 <meta charset="utf-8" /> 3 <?php 4 function get_time() { 5 list($usec, $sec) = explode(" ", microtime()); 6 return ((float)$usec + (float)$sec); 7 } 8 9 $algos = array('md5','sha1','sha256','sha512','whirlpool','bcrypt','scrypt'); 10 11 12 echo "<textarea style='width:800px;height:500px'>"; 13 echo "알고리즘\t수행시간\t해시값\t\t\t\t\tfunction_exists()\n"; 14 foreach($algos as $algo) { 15 $start = get_time(); 16 for($i=0;$i<1000;$i++) 17 $hash_value = hash($algo, 'testhash!1'); 18 $end = get_time(); 19 $time = $end - $start; 20 21 echo $algo."\t"; 22 echo number_format($time,5)."\t"; 23 echo $hash_value."\t"; 24 echo "exist?=".function_exists($algo)."\n"; 25 } 26 echo "</textarea>";
그 결과
알고리즘 수행시간 해시값 function_exists() md5 0.00086 705a6612fe474053e79d0494c9fa3965 exist?=1 sha1 0.00086 07c97cfbec2c25b6f1aba02f393b33f6765cf0e3 exist?=1 sha256 0.00146 9c64c70df3501b479b9631a0a6481b6c0d0427bd75c7a3133337105213bc2916 exist?= sha512 0.00160 e8bd620b57c715891406bcd5c9bb744bdabcc91dd82e4366a3ee63415800bc5bc2d1ba076ac25e3b557e9bc6122e068ccdd17b9ac384a9155ed1992f2fc17c13 exist?= whirlpool 0.00185 0d7903152df716e4f3345251d8fbe6aed2aaecdf441ee4719bcd59cb11c5a4a453ec915704dcc2ffd3fbbb5cef684bd6efdfd8ded9d6f137bcb8a0ffa9fcc428 exist?= bcrypt 0.00446 exist?= scrypt 0.00427 exist?=
sha512의 경우
hash 값은 정상적으로 출력되고 있지만,
function_exists() 결과값은 나오지 않습니다.
오직 md5하고 sha1만 function_exists() 결과가 1로 나옵니다.
그래서
xe member.model.php 에서
$isSha2 = ($this->useSha2 && function_exists('sha512'));
이런 식으로 쓰려고 했는데
function_exists('sha512') 결과가 반환되지 않아서 이대로는 못쓰고,
&& function_exists('sha512') 부분을 제거하고 써야할 것 같습니다.
당장은 문제가 없으니까 그렇게 써도 되겠지만,
다른 홈페이지에 적용한다거나 할 때 문제가 될 수도 있겠다 싶어서 해결을 보고 가야할 듯 합니다.
어떻게 해결을 해야 할까요?
댓글 3
-
YJSoft
2015.01.31 12:11
-
세상의모든계산기
2015.01.31 12:12
두놈만 따로 함수가 있는 거군요.
감사합니다.
-
세상의모든계산기
2015.01.31 12:27
이렇게 바꾸니까 확인이 되네요.24 echo "exist?=".function_exists($algo)."\n"; 24 echo "exist?=".(function_exists('hash') && in_array($algo, hash_algos()))."\n";
알고리즘 수행시간 해시값 hash_algos() md5 0.00062 705a6612fe474053e79d0494c9fa3965 exist?=1 sha1 0.00083 07c97cfbec2c25b6f1aba02f393b33f6765cf0e3 exist?=1 sha256 0.00129 9c64c70df3501b479b9631a0a6481b6c0d0427bd75c7a3133337105213bc2916 exist?=1 sha512 0.00150 e8bd620b57c715891406bcd5c9bb744bdabcc91dd82e4366a3ee63415800bc5bc2d1ba076ac25e3b557e9bc6122e068ccdd17b9ac384a9155ed1992f2fc17c13 exist?=1 whirlpool 0.00181 0d7903152df716e4f3345251d8fbe6aed2aaecdf441ee4719bcd59cb11c5a4a453ec915704dcc2ffd3fbbb5cef684bd6efdfd8ded9d6f137bcb8a0ffa9fcc428 exist?=1 bcrypt 0.00437 exist?= scrypt 0.00394 exist?=
function_exists는 함수의 존재 여부를 체크하는 함수로, md5와 sha1은 함수가 따로 있지만 sha256,sha512 등은 없습니다.(md5 : http://php.net/manual/en/function.md5.php , sha1 : http://php.net/manual/en/function.sha1.php )
hash_algos 함수에서 사용 가능한 해싱 방식을 array로 반환하니 이중에 특정 해싱 방법이 존재하는지 확인하는 방법을 사용하시면 됩니다.