2014-06-07 7 views
-1

등록 페이지에서 SHA1 has와 salt를 사용하여 데이터베이스에 암호를 저장했습니다. 나는 소금이 포함되어있는 데이터베이스를 점검 할 때 올바르게 수행했다고 생각합니다. 이것이 내가 그 일을 한 방법입니다. 소금과 해시 문제로 로그인

$newPassword = $_POST['Password'] ; 
    if (!empty($newPassword)) { 
    //Escape bad characters 
    //$newuser = mysql_real_escape_string($newuser); 
    //remove leading and trailing whitespace 
    $newPassword = trim($newPassword); 
    $newPassword = sha1($newPassword); 
    $salt = '-45dfeHK/[email protected]/klF21-1_\/4JkUP/4'; 

} 
else die ("ERROR: Enter a Password"); 

입력

내가 로그인 할 때 내 문제가 낳는

$query = "INSERT INTO members (memberFirstname, memberSecondname, memberEmailaddress, memberPassword, memberAddress, memberPostcode) VALUES ('$newFirstName', '$newSecondName', '$newEmailAddress', '$newPassword$salt', '$newAddress', '$newPostcode')"; 

입니다. 소금을 제거하고 비밀 번호를 푸는 방법에 대해 확신 할 수 없습니다 (필요한 경우 수행해야 함). 나는 전자 메일 주소를 입력하고 암호 필드에 해시 및 소금을 붙여 넣을 수 있으며 성공적으로 로그인 할 수 있습니다.

은 로그인 내 스크립트입니다.

<?php 
include 'db.inc'; 
session_start(); 
$UserEmail =$_POST["EmailAddress"]; 
$UserPassword =$_POST["Password"]; 
$query = "SELECT * FROM members WHERE memberEmailaddress = '$UserEmail' 
     AND memberPassword = '$UserPassword' "; 

$connection = mysql_connect($hostname, $username, $password) or die ("Unable to connect!"); 
mysql_select_db($databaseName) or die ("Unable to select database!"); 
$result = mysql_query($query) or die ("Error in query: $query. ".mysql_error()); 
// see if any rows were returned 
if (mysql_num_rows($result) > 0) { 
    $_SESSION["authenticatedUser"] = $UserEmail; 
    // Relocate to the logged-in page 
    header("Location: Index.php"); 
} 
else 
    { 
    $_SESSION["message"] = "Could not connect log in as $UserEmail " ; 
    header("Location: Login.php"); 
    }  
mysql_free_result($result); 
mysql_close($connection); 

?> 
+1

대신이 코드를 사용하십시오. http://docs.php.net/manual/en/ref.password.php – PeeHaa

+1

http://stackoverflow.com/questions/60174/how-can-i-prevent-sql을 참조하십시오. -injection-in-php – PeeHaa

+1

소금을 잘못 사용하고 있으며 비밀번호 보호를 위해 부적절한 해싱 기능을 선택했습니다. 이 물건을 직접하려고해서는 안됩니다. 기성품 라이브러리를 사용하십시오. 보안은이 물건을 잘못 가져 오는 데 너무 중요합니다. ** ** 잘못된 것입니다. 암호를 올바르게 저장하는 것은 어려운 문제입니다. – meagar

답변

1

당신의 접근 방식에 몇 가지 문제가 있습니다. 먼저 소금을 사용하지 마십시오. 소금은 저장되지만 사용되지는 않습니다. 두 번째 소금은 각 암호마다 고유해야합니다. 정적 소금이 사용되는 경우 실제로는 소금이 아닙니다. 더 나아가 빠른 해쉬 알고리즘을 사용합니다. 그러나 이는 너무 무차별적일 수 있습니다. 대신 BCrypt 또는 PBKDF2와 같은 비용 요소를 사용하는 해시 알고리즘으로 전환해야합니다.

PHP 이미 암호를 해시하는 좋은 기능이있다 (어쩌면 당신이 필요를 compatibility pack는) :

// Hash a new password for storing in the database. 
// The function automatically generates a cryptographically safe salt. 
$hashToStoreInDb = password_hash($password, PASSWORD_BCRYPT); 

// Check if the hash of the entered login password, matches the stored hash. 
// The salt and the cost factor will be extracted from $existingHashFromDb. 
$isPasswordCorrect = password_verify($password, $existingHashFromDb); 

이 기능은 그 자체로 안전한 소금을 생성하고 생성 된 해시 값에 첨부하기 때문에, 당신은 할 수 없습니다 SQL로 직접 암호를 확인하십시오. 대신 저장된 해시 (사용자 이름 별)를 가져 오는 쿼리를 수행하면 저장된 비밀번호로 입력 된 비밀번호를 확인할 수 있습니다. 나는 tutorial을 썼다. 여기서 중요한 점을 더 깊이 설명하려고 노력했다.