Как использовать sha256 в php5.3.0
Я использую sha256 для шифрования пароля. Я могу сохранить зашифрованный пароль sha256 в mysql. Но я не могу войти с тем же предложением.
Вставить код:
<?php
error_reporting(E_ALL ^ E_NOTICE);
$username = $_POST['uusername'];
$passcode = $_POST['ppasscode'];
$userflag = $_POST['uuserflag'];
//$passcodeen = hash('sha256',$passcode);
$passcodeen = hash('sha256', (get_magic_quotes_gpc() ? stripslashes($ppasscode) : $ppasscode));
$conn = mysql_connect("localhost","charles","charles") or die("connection failed with DB:".mysql_error());
mysql_select_db("sessiondb");
$query = "INSERT INTO users(username,passcode,userflag) values('$username','$passcodeen','$userflag')";
Выберите код:
<?php
error_reporting(E_ALL ^ E_NOTICE);
@mysql_connect("localhost","charles","charles") or die("Connection failed".mysql_error());
@mysql_select_db("sessiondb") or die("Database doesn't exist".mysql_error());
//get user input
$username = $_POST['username'];
$ppasscode = $_POST['ppasscode'];
//$passcodeen = hash('sha256', $ppasscode);
$passcodeen = hash('sha256', (get_magic_quotes_gpc() ? stripslashes($ppasscode) : $ppasscode));
//get session value from mysql
$query = @mysql_query("select username, userflag from users where username ='$username' and passcode = '$passcodeen'") or die("Query execution failed".mysql_error());
Есть ли что-то не так? Я очень смущен. Благодарю.
Ответы
Ответ 1
Может ли это быть опечатка? (два Ps в ppasscode, предназначенные?)
$_POST['ppasscode'];
Я бы удостоверился и сделаю:
print_r($_POST);
и убедитесь, что данные там точны, а затем повторите то, что должно выглядеть:
echo hash('sha256', $_POST['ppasscode']);
Сравните этот результат с тем, что у вас есть в базе данных (вручную). Делая это, вы изучаете свои возможные моменты отказа:
- Получение пароля из формы
- хеширование пароля
- сохраненный пароль
- сравнение двух.
Ответ 2
Прежде всего, sha256 является алгоритмом хэширования, а не типом шифрования. Для шифрования потребуется иметь способ дешифрования информации до ее первоначального значения (коллизии в сторону).
Глядя на ваш код, кажется, он должен работать, если вы предоставляете правильный параметр.
-
Сначала попробуйте использовать литеральную строку в вашем коде и проверьте ее достоверность вместо использования переменной $_POST[]
-
Попробуйте переместить сравнение из запроса базы данных к коду (получить хэш для данного пользователя и сравнить с хешем, который вы только что вычислили)
Но самое главное, прежде чем размещать это в каком-либо общественном стиле, пожалуйста, не забудьте очистить свои данные. Не допускайте вставки произвольного SQL-запроса в запросы. Лучшая идея здесь заключалась бы в использовании параметризованных запросов.
Ответ 3
Вы должны использовать Adaptive hashing, например http://en.wikipedia.org/wiki/Bcrypt для защиты паролей
Ответ 4
Лучшим решением является простое использование превосходной совместимости script от Энтони Феррары:
https://github.com/ircmaxell/password_compat
Пожалуйста, а также при проверке пароля всегда добавляйте способ (желательно асинхронный, чтобы он не влиял на процесс проверки для timming атак), чтобы обновить хэш, если это необходимо.