2013-08-08 2 views
0

암호를 저장하기위한 다음 코드를 사용하여 암호를 저장하는 이름과 암호 crypt()와 복어를 사용하면 작동하지만 로그인 양식에서 암호를 어떻게 암호 해독 할 수 있는지 모르겠 음크립트와 복어로 로그인 폼을 어떻게 만들 수 있습니까?

$user = $_POST['user']; 
$password = $_POST['pass']; 
function cryptPass($input, $rounds = 5){ 
$salt = ""; 
$saltChars = array_merge(range('A','Z'), range('a','z'), range(0,9)); 
for($i=0; $i < 22; $i++) { 
    $salt .= $saltChars[array_rand($saltChars)]; 
} 
return crypt($input, sprintf('$2y$%02d$', $rounds) . $salt); 
} 
$password_hash = cryptPass($password); 
$cSQL = "INSERT INTO USERDB (NAME, PASS) VALUES(?,?)"; 
$stmt = $db->prepare($cSQL); 
$stmt->bind_param('ss', $name, $password_hash); 
$stmt->execute(); 
$stmt->close(); 

그리고 암호를 해독하는 기능이지만 작동하지 않습니다. 내 실수는 어디에서 발생합니까?

$user = $_POST['user']; 
$password= $_POST['pass']; 
function cryptPass($input, $rounds = 6) 
{ 
$salt = ""; 
$saltChars = array_merge(range('A','Z'), range('a','z'), range(0,9)); 
for($i=0; $i < 22; $i++) { 
    $salt .= $saltChars[array_rand($saltChars)]; 
} 
return crypt($input, sprintf('$2x$%02d$', $rounds) . $salt); 
} 
$inputPass = $password; 
$pass = $password; 
$hashedPass = cryptPass($pass); 
$passcrypt = crypt($inputPass, $hashedPass); 
$stmt = $db->prepare("SELECT NAME, PASS 
FROM USERDB 
WHERE NAME = ? AND PASS =?"); 
$stmt->bind_param('ss', $user, $passcrypt); 
$stmt->execute(); 
$stmt->close(); 

답변

1

PHP 5.5에서 새로운 암호 해시 API를 사용하십시오. 이전 버전을 사용하는 경우 https://github.com/ircmaxell/password_compat을 사용하여 PHP에서 이전 버전 5.3.7과 동일한 기능을 사용하십시오.

사용법은 매우 간단합니다 :

계정 생성 :

$hash = password_hash($password); 

를 데이터베이스에 저장 해시를.

확인 :

if (password_verify($posted_password, $hash_from_db)) { // login } 

더 많은 정보를 원하시면 설명서를 참조하십시오!

해시 된 암호를 데이터베이스에서 읽어야 사용했던 소금을 얻을 수 있습니다. 그것은 또한 당신의 코드에서 오류입니다. 로그인 암호와 원래 해시를 비교할 때 임의의 소금물로 처리 된 해시를 만들 수 없습니다. 두 해시를 비교해야하며 로그인 비밀번호는 원래 비밀번호와 같은 소금으로 해쉬되어야합니다. 그렇지 않으면 해시가 일치하지 않습니다.

관련 문제