2016-06-05 1 views
0

У меня есть проблема с входом в систему с использованием пароля, который хэшируется в базе данных. Мой текущий скрипт просто сообщает мне сообщение «плохой пароль», даже когда оно правильно.У меня проблема с myshl/php hash (sha1)

$s = $mysqli->query("SELECT * FROM `users` WHERE email`='".$_POST['email']."'") or die(); 
$i = $s->fetch_assoc(); 
if($_POST['password'] == sha1($i['password'])) { 
echo "works"; 
} else { 
    echo "bad password"; 
} 
+0

может добавить пример хэшированной строки пароля на ваш вопрос? –

+4

Широко открыты для взлома –

+0

Почему sha vs md5 http://security.stackexchange.com/questions/19705/is-sha1-better-than-md5-only-because-it-generates-a-hash-of-160 -bits – unixmiah

ответ

6

Вы делаете это неправильно. Пароль базы данных уже хэшируютсяЯ надеюсь но пользователь вводит простой текстовый пароль, так что вам нужно хэширования, что входит пользователь и посмотреть, если это соответствует хэш у вас есть в базе данных

$s = $mysqli->query("SELECT * FROM `users` WHERE `email`='{$_POST['email']}'") or die(); 
$i = $s->fetch_assoc(); 
if(sha1($_POST['password']) == $i['password']) { 
    echo "works"; 
} else { 
    echo "bad password"; 
} 

Однако

Пожалуйста, не ролла своего собственного хэширования паролей. PHP предоставляет password_hash() и password_verify(), пожалуйста, используйте их, я мог бы использовать ваш сайт один день А вот некоторые good ideas about passwords Если вы используете PHP версии до 5,5 there is a compatibility pack available here

Также

Ваш скрипт находится под угрозой SQL Injection Attack Посмотрите, что произошло с Little Bobby Tables Даже if you are escaping inputs, its not safe! Использование prepared statement and parameterized statements

-1

Вот пример того, как можно проверить ша с MySQL безопасно.

<?php 
    // Basic php MYSQL authentication with crypted password 

    $username = $_POST['username']; 
    $password = $_POST['password']; 
    $salt = "CrazyassLongSALTThatMakesYourUsersPasswordVeryLong123!!312567__asdSdas"; 
    $password = hash('sha256', $salt.$password); 
    //echo $password; 

    // Mysql connection 
    $mysqli = new mysqli("localhost","mysqluser","mysqlpassword","mysqldatabase"); 
    $stmt = $mysqli->prepare('SELECT userid FROM Users WHERE password = ? AND username = ?'); 
    // (ss -> string, string) Always bind parameters and use prepared statement to improve security 
    $stmt->bind_param("ss", $password, $username); 
    $stmt->execute(); 
    $stmt->bind_result($userid); 

    if (!empty($stmt->fetch())) { 
    // if fetch is not empty we have results and password hash was correct 
    echo "User was found"; 
    } else 
    echo "User was not found"; 

$mysqli->close(); 
?> 
+2

Это не безопасно! Соль постоянна, что делает ее перцем/ключом, ваши хеши несолены. Использование SHA256 не подходит для хэширования паролей, потому что это слишком быстро ([14 Giga SHA256 в секунду] (http://hashcat.net/oclhashcat/#performance)), что делает слишком грубым принуждение. Вместо этого используйте алгоритм с коэффициентом затрат: [см. Password_hash()] (http://www.php.net/manual/en/function.password-hash.php). В конце концов, ваш пример использует параметризованные запросы, что хорошо. – martinstoeckli

Смежные вопросы