2013-12-17 3 views
1

빠르고 더러운 실험.PHP 암호 문제

이 코드를 .php 파일에 넣고 웹 호스트에서로드했습니다.

결과는 "작동합니다!" 하지만 .. 왜? 실패 했어야합니까? 여기에서 예 # 1을 다음되었습니다 http://php.net/manual/en/function.crypt.php

<?php 
$pass1 = "thetimeshallwhintercows"; 
$salt = "temperpedic"; 

$crypt_pass = crypt($pass1, $salt); 

if($crypt_pass == crypt("thetimeshallwhintercowz", $crypt_pass)) 
{ 
    print("It works!<br/>"); 
    print($crypt_pass ); 
    print("<br/>"); 
    print(crypt("thetimeshallwhintercowz", $crypt_pass)); 
} 
else 
{ 
    print("try again...."); 
} 

?> 
+0

예 # 1 (http://php.net/manual/en/function.crypt이어야한다. php) (코드의 주석으로)'// 소금을 자동으로 생성하게합니다'. 바로 같은 페이지에서'$ user_input = "mypassword"; '를 사용 (추가) 한 다음'$ user_input = "mypassword2";로 수정하면 의도 한대로 작동합니다. –

+0

[Rezigned 's answer] (http://stackoverflow.com/a/20625155/1415724)는 많은 의미를 가지며 "돈에 옳다"라고 말합니다. 처음 8자는 동일하지 않아야합니다. –

답변

3

당신은 this answer to a similar question을 봐야합니다. crypt() 기능을 사용하려면 올바른 형식의 소금이 있어야합니다. temperpedic은 유효한 소금 (일종의)이지만 실제로는 올바르게 포맷 된 소금이 아닙니다.

외모가 at the PHP documentation for the crypt() function 인 경우 다른 해시 유형이 인 crypt()를 사용하는 의 몇 가지 예가 있습니다. 이 예를 살펴보십시오.

최신 웹 응용 프로그램의 경우 crypt를 사용할 경우 최소한 SHA-256을 사용해야합니다. 이것을 설명하기 위해

<?php 
$pass1 = "thetimeshallwhintercows"; 
$salt = "temperpedic"; 

echo 'SHA-256:  ' . crypt($pass1, '$5$rounds=5000$' . $salt . '$') . "\n"; 
echo 'SHA-256:  ' . crypt($pass1, '$5$rounds=5000$' . $salt . 'extra$') . "\n"; 
echo 'SHA-256:  ' . crypt($pass1, '$5$rounds=5000$' . $salt . 'evenextra$') . "\n"; 

?> 

[email protected] /tmp $ php lol.php 
SHA-256:  $5$rounds=5000$temperpedic$4g0qFd4Oqr/O.8aZMPiyrO9x5VUaQt14eXPOMr5asK2 
SHA-256:  $5$rounds=5000$temperpedicextra$3BF4dmqrCBuY2UtQpuhxXm4t4KGp1M9OoJPrskM490/ 
SHA-256:  $5$rounds=5000$temperpedicevene$jBsGNFGSAbuL8hdcXsZjHRrH6u4qnXb1bAJ.TOR32A2 
0

난 당신의 코드를 실행하고 내가 가지고 : "그것은 작동"

모든 확인을 참조
It works! 
teTHe69uKVFMw 
teTHe69uKVFMw 

는,

내 생각에, 특정 스크립트를 실행하려면 http://yourhost/에 액세스했기 때문에 "작동"하면 해당 스크립트를 명시 적으로 지정해야합니다. URL에 http://yourhost/yourscript.php

1

는()이 doc

에서 표준 DES 기반 토굴을 살펴 출력의 처음 두 문자로 소금을 반환합니다. 또한 str의 처음 8 자만 사용하므로 같은 8 자로 시작하는 긴 문자열은 동일한 결과가 생성됩니다 (동일한 소금이 사용될 때).

소금이 지정되지 않은 경우 (귀하의 경우) DES 기반 암호 기능을 사용합니다. 귀하의 예제에서

$pass1 = "thetimeshallwhintercows"; 
$salt = "temperpedic"; 

crypt($pass1, $salt); // returns teTHe69uKVFMw 

는 출력 문자의 첫 번째 (2) 소금 즉, 처음 두 문자와 동일한 것을 알나요 te

중요한 부분은 는 처음 8 자만을 사용 그것은 "입니다 입력의 ". 그런 이유로 $pass1$pass2이 동일하지 않은 경우에도 동일한 출력을 얻습니다. 당신이 다른 결과 를 원하는 경우 처음 8 자 [해당 페이지 상태에서] 같은

$pass1 = 'thetimeshallwhintercowz'; 
$pass2 = 'thetimeshallwhintercows'; 

// crypt only uses first 8 chars so 'thetimes' so it basically do this 
crypt('thetimes', 'temperpedic'); 

// That explains why you get the same result 
+0

거기에 요점이 있습니다. 내 부분에서'+ 1' 값을 치를만한 가치가 있습니다 - 나는 당신의 이론을 테스트했고, 당신은 강타 중입니다. –

+0

@ Fred-ii- 그래, 고마워. – Rezigned

+1

반갑습니다. –