2011-11-10 3 views
0

웹 사이트의 간단한 등록 및 로그인 페이지입니다. 나는 암호 + 소금물 치는 것을 시도하고있다. 그게 내가 한 짓이야.하지만 내가 맞는지 확실하지 않아.PHP 암호 암호

이것은 등록 페이지에서 일어나는 것입니다 :

데이터베이스에서
$blowfish = '$2a$10$'; 
$salt = '8dF$d_3'; 
$hashedPass = crypt($password,$blowfish . $salt); 

, 암호 "RAYray99는"$의 2A $ $ 10 8dF $의 d_3 "로 저장됩니다 $$$$$$$$$$ $$$$. wxsfa7X.nkcGqldJ9fujdd8eY.H85uC "로그인 페이지


는, 나는 데이터베이스에 암호를 입력 한 암호를 확인하는 방법에 붙어 있어요.

mysql_connect("$db_host", "$db_username", "$db_pass") or die(mysql_error()); 
//select the database or return error message 
mysql_select_db("$db_name") or die("database does not exist"); 

$email = stripslashes($_POST['email']); 
$email = strip_tags($email); 
$email = mysql_real_escape_string($email); 
$password = ereg_replace("[^A-Za-z0-9]", "", $_POST['password']); // filter everything but numbers and letters 
$password = crypt($password); 

$sql = mysql_query("SELECT * FROM members WHERE email='$email' AND password='$password' AND activateemail='1'"); 
$login_check = mysql_num_rows($sql); 
if($login_check > 0){ 
while($row = mysql_fetch_array($sql)){ 
    // Get member ID into a session variable 
    $id = $row["id"]; 
    session_register('id'); 
    $_SESSION['id'] = $id; 
    // Get member username into a session variable 
    $username = $row["username"]; 
    session_register('username'); 
    $_SESSION['username'] = $username; 
    // Update last_log_date field for this member now 
    mysql_query("UPDATE members SET lastlogin=now() WHERE id='$id'"); 
    // Print success message here if all went well then exit the script 
    header("location: account.php"); 
    exit(); 
} // close while 

} else { 
// Print login failure message to the user and link them back to your login page 
    print '<br /><br /><font color="#FF0000">ERROR TRY AGAIN </font><br />; 
    exit(); 
} 

내 질문에 내가 로그인 passsword가 데이터베이스에서 1 로그인 페이지에 입력 확인하는 것이 방법입니다

사용자를 확인하는 loging의 PHP 스크립트입니다.

내가 내 SQL 쿼리 (doctrine2)에 대한 매퍼를 사용하고, 레이

+0

암호를 암호화하지 마십시오 ... 대신 해시하십시오! 그리고''태그를 제거하십시오. 그것들은 오랫동안 사용되지 않았습니다! 마지막으로,'Location :'헤더는 RFC에 따라 절대 URL이어야합니다. 예, 상대 경로는 일반적으로 * 작동하지만, 그렇지 않을 경우 문제를 일으키지 않으려 고합니다. 또한 SQL 주입이 필요합니다. ** 스트라이핑 스래시는 SQL 삽입에 대한 적절한 보호가 아닙니다! 준비된 쿼리로 PDO를 배우십시오. – Brad

+0

왜 해싱 (암호 해독이 거의 불가능)하지 않고 암호를 암호화합니까? 비밀번호를 필터링하면 더 안전하지 않습니다! 그런데 ['ereg_replace()'] (http://php.net/manual/function.ereg-replace.php)는 더 이상 사용되지 않습니다. – ComFreek

+0

귀하의 질문과 관련없는 조언, 당신은 따옴표로 그들을 사용하여 변수를 넣을 필요가 없습니다. 예를 들어, 당신의 연결 호출은 단지'mysql_connect ($ db_host, $ db_username, $ db_pass) 일 수 있습니다. – jprofitt

답변

0

을 주셔서 감사합니다.

내 암호는 ...

/** 
* Executes an authentication try 
* 
* @throws Zend_Auth_Adapter_Exception if the authentication failed 
* @return Zend_Auth_Result 
*/ 
public function authenticate() 
{ 
     //check if login is correct 
     try{ 
       $user = $this->_em->getRepository('App_Model_User') 
        ->findOneBy(
         array(
          '_email' => $this->_login, 
          '_password' => App_Model_User::encodePassword($this->_password) 
         ) 
       ); 
     }catch(Exception $e){ 
       throw new Zend_Auth_Adapter_Exception('authentication failed', 0, $e);    
     } 

내 DB

public function setPassword($password) { 
    $this->_password = self::encodePassword ($password); 
    return $this; 
} 
/** 
* This function encodes the password to md5 after adding a salt 
* @param string $password 
*/ 
public static function encodePassword($password) { 
    $salt = 'dsa7893ujlksdsagkz27392kjsjaldksju928ikljda27'; 
    return md5 ($password . $salt); 
} 

내 로그인은 다음과 같습니다에 MD5 + 소금으로 저장됩니다 .............

+1

'md5'를'sha256' 또는'sha512'로 바꿀 것을 권합니다. – ComFreek

+0

이러한 알고리즘의 길이는 얼마입니까? –

+0

다음은 목록입니다 : http://php.net/manual/en/function.hash.php#104987 – ComFreek

-1

@ 브래드는 암호를 암호화하는 대신 암호를 해싱하는 것이 더 간단하고 (어느 정도 안전 할 것입니다) 지적했습니다.

MySQL은 MD5와 SHA1 해시를 모두 지원합니다.

$SQL = "SELECT * FROM users WHERE username = '$user' AND pass = MD5('{$salt}{$pass}')"; 
+1

PHP의'crypt()'함수는 양방향 암호화가 아닙니다. 이름은 완전히 오도 된 것입니다 (PHP 기본 라이브러리에 대해 다른 점을 추가하십시오). PHP 문서에서는 함수 페이지에 "crypt - One way string hashing"이라고까지 쓰는 경우조차 있습니다. – Tesserex

+0

당신은 완전히 옳았습니다, 나는 그것을 mcrypt 함수와 혼동하여 확인하지 않았습니다. – rantsh

1

암호를 확인하려면 데이터베이스에

$pass = md5($salt . $pass); 
$SQL = "SELECT * FROM users WHERE username = '$user' AND pass = '$pass';"; 

또는 직접 당신이 정확히 입력 한 해싱해야한다 :이 길을가는 장점

하나는 당신도 할 수있다 첫 번째 장소에 보관했을 때와 같은 방식입니다.

내가 갖고있는 것에 몇 가지 문제점이 있습니다. 먼저 crypt()의 복어 문자열은 PHP 문서에 따라 $2a$10$./0-9A-Za-z의 알파벳 22 개 문자열이어야합니다. 당신의 소금은 그것을 따르지 않으므로, 해쉬 함수는 아마도 완전히 실패 할 것입니다.

또한 소금은 앱에서 상수가 아니어야하며 각 사용자별로 고유해야하며 해시 된 비밀번호와 함께 db에 저장되어야합니다.

마지막으로 암호를 해싱하기 전에 해당 암호로 변환하지 않아야합니다. 일반 텍스트 비밀번호를 입력으로 사용하는 함수를 분리하여 해시 된 비밀번호를 출력합니다.암호를 저장할 때와 로그인을 확인할 때이 기능을 모두 사용하십시오. 그렇게하면 데이터베이스와 일치해야합니다.

0
$password = $_POST['password']; 
$str = "$2a$10$8dF$d_3$$$$$$$$$$$$$$.wxsfa7X.nkcGqldJ9fujdd8eY.H85uC"; 

if (preg_match('/^(.{7})(.{7})(.+?)$/', $str, $m)) 
{ 
    $blowfish = $m[1]; 
    $salt = $m[2]; 
    $hashedPass = $m[3]; 
    $validHashedPass = crypt($password,$blowfish.$salt); 

    if ($validHashedPass == $hashedPass) 
    { 
      good pass 
    } 
    else 
    { 
      wrong auth 
    } 
} 
0

이 사례를 위해 만들어진 클래스가 있습니다. SQL 삽입을 방지하기 위해 sha1() 해싱 함수와 PDO prepared statements를 사용합니다. 나는 그것을 찾아서 여기에 올리려고 노력할 것이지만, 그렇지 않으면, 이것은 당신에게 나의 충고입니다.

  • 암호 해독 기능이 아닌 해싱 기능을 사용하십시오.
  • mysql_*은 준비된 문을 지원하지 않으므로 사용하지 마십시오. PDO 또는 매우 leat, mysqli을 사용하십시오.
+0

고맙습니다. 발견한다면 그것을 게시하십시오. 건배 –