PHP пароль шифрования - PullRequest
       1

PHP пароль шифрования

0 голосов
/ 10 ноября 2011

Простая страница регистрации и входа на сайт.Я пытаюсь зашифровать пароль + соление.Это то, что я сделал, но я не уверен, правильно ли это.

Это то, что происходит на странице регистрации:

$blowfish = '$2a$10$';
$salt = '8dF$d_3';
$hashedPass = crypt($password,$blowfish . $salt);

В базе данных пароль "RAYray99" хранится как«$ 2a $ 10 $ 8dF $ d_3 $$$$$$$$$$$$$$. Wxsfa7X.nkcGqldJ9fujdd8eY.H85uC"


На странице входа я застрял наКак проверить пароль, введенный с паролем в базе данных.

Это php-скрипт регистрации, который проверяет пользователя:

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();
}

Мой вопрос, как быЯ проверяю имя пользователя, введенное на странице входа, в базе данных с цифрой 1.

Спасибо, Рэй

Ответы [ 5 ]

1 голос
/ 10 ноября 2011

Для проверки пароля вы должны хэшировать введенный пароль точно так же, как вы это делали, когда хранили его в первую очередь.

Я вижу некоторые проблемы с тем, что у вас есть. Во-первых, строка blowfish для crypt() указывает, согласно документации PHP, что после вашего $2a$10$ должна быть строка из 22 символов из алфавита ./0-9A-Za-z. Ваша соль не следует этому, поэтому хэш-функция, вероятно, полностью не работает (хотя я не уверен).

Кроме того, ваша соль не должна быть константой в вашем приложении, она должна быть уникальной для каждого пользователя и храниться в БД вместе с их хешированным паролем.

Наконец, вы не должны выполнять эти преобразования для пароля перед его хэшированием. Выключите функцию, которая имеет пароль в виде открытого текста и выводит хешированный пароль. Используйте эту функцию как при сохранении пароля, так и при попытке подтвердить логин. Таким образом, вы точно знаете, что он должен соответствовать базе данных.

0 голосов
/ 10 ноября 2011

У меня есть класс, созданный только для этого случая.Он использует хэш-функцию sha1() и подготовленные операторы PDO для предотвращения SQL-инъекций.Я постараюсь найти его и опубликовать здесь, но если я этого не сделаю, это мой вам совет:

  • Используйте функцию хеширования, а не шифрование.
  • Не используйте mysql_*, так как он не поддерживает подготовленные операторы.Используйте PDO или по крайней мере, mysqli.
0 голосов
/ 10 ноября 2011
$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 голосов
/ 10 ноября 2011

Как указал @Brad, будет проще (и в некоторой степени безопаснее) хешировать пароли вместо их шифрования.

MySQL в любом случае поддерживает как MD5, так и SHA1.

Одним из преимуществ этого маршрута является то, что вы можете сделать:

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

ИЛИ непосредственно в базе данных

$SQL = "SELECT * FROM users WHERE username = '$user' AND pass = MD5('{$salt}{$pass}')";
0 голосов
/ 10 ноября 2011

Я использую маппер для моих запросов sql (doctrine2).

Мои пароли сохраняются с солью md5 + в моей базе данных

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 );
}

Мой логин выглядит так ...

/**
 * 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 );            
        }

.............

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...