Как использовать 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());

Здесь что-то не так? Я очень смущен. Спасибо.


person SUN Jiangong    schedule 17.11.2009    source источник
comment
Вы используете поле VARCHAR для хранения пароля? Поскольку максимальный размер varchars составляет 255 символов...   -  person davethegr8    schedule 18.11.2009
comment
Можете ли вы опубликовать образец хеша, хранящегося в базе данных, по сравнению с тем, как он выглядит в коде?   -  person Noah Goodrich    schedule 18.11.2009
comment
Для sha256 вам нужен VARCHAR не менее 64 символов.   -  person Percutio    schedule 18.11.2009
comment
@ davethegr8, да, я использую varchar (255), правильно?   -  person SUN Jiangong    schedule 18.11.2009
comment
@Ноа Гудрич, значение, хранящееся в mysql: 8c6976e5b5410415bde908bd4dee15dfb167a9c873fc4bb8a81f6f2ab448a918   -  person SUN Jiangong    schedule 18.11.2009
comment
@jp, да, думаю, с моим типом varchar достаточно.   -  person SUN Jiangong    schedule 18.11.2009
comment
как насчет публикации кода, который вы используете для аутентификации? Проблема может быть там?   -  person mauris    schedule 18.11.2009
comment
Не могли бы вы предоставить код? Я понимаю, что вы, вероятно, сделали INSERT в своей базе данных, но для аутентификации вы должны сделать SELECT, можете ли вы опубликовать код?   -  person Percutio    schedule 18.11.2009
comment
@thephpdeveloper, я отредактировал код. Спасибо за проверку.   -  person SUN Jiangong    schedule 18.11.2009
comment
@JP, я опубликовал это. Пожалуйста, проверьте его и посмотрите, в чем проблема, большое спасибо.   -  person SUN Jiangong    schedule 18.11.2009
comment
@ garcon1986 - Мое первое предположение состоит в том, что два хеш-значения разные. Вы выложили только один. Таким образом, проблема заключается либо в хеш-значении, поступающем в базу данных после его сохранения, либо в хэш-значении, которое вы генерируете при входе в систему.   -  person Noah Goodrich    schedule 18.11.2009
comment
Просто чтобы устранить некоторые неправильные представления здесь, @davethegr8 - в нескольких последних версиях MySQL поля varchar в основном являются текстовыми полями и больше НЕ ограничены 255 символами. И, @jp и @garcon: SHA256 всегда 64 символа, просто используйте тип столбца CHAR(64) и пропустите накладные расходы.   -  person Dereleased    schedule 18.11.2009
comment
проверьте, не попадает ли ваш код в волшебные кавычки, примерно так: $passcodeen = hash('sha256', (get_magic_quotes_gpc() ? stripslashes($ppasscode) : $ppasscode));   -  person Dereleased    schedule 18.11.2009
comment
@Noah Goodrich, да, но я использую одно и то же имя пользователя и пароль при создании и выборе в mysql. И проблем быть не должно.   -  person SUN Jiangong    schedule 18.11.2009
comment
@garcon, я думаю, Ной имеет в виду, что на одном из шагов что-то идет не так. Пожалуйста, опубликуйте строки SQL для каждого запроса, чтобы мы могли видеть.   -  person Dereleased    schedule 18.11.2009
comment
@dereleased, спасибо, я не знаю, как это работает, но я работаю с кодом. Можете ли вы объяснить это конкретно? Большое спасибо.   -  person SUN Jiangong    schedule 18.11.2009
comment
@dereleased, я разместил весь полезный код.   -  person SUN Jiangong    schedule 18.11.2009
comment
sha256 — это алгоритм хэширования, а не шифрования   -  person mrid    schedule 27.02.2019


Ответы (5)


Может это опечатка? (два P в ppasscode, как предполагалось?)

$_POST['ppasscode'];

Я бы убедился и сделал:

print_r($_POST);

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

echo hash('sha256', $_POST['ppasscode']);

Сравните этот вывод с тем, что у вас есть в базе данных (вручную). Делая это, вы исследуете свои возможные точки отказа:

  1. Получение пароля из формы
  2. хеширование пароля
  3. сохраненный пароль
  4. сравнение двух.
person Jeremy Morgan    schedule 17.11.2009

Во-первых, sha256 — это алгоритм хеширования, а не тип шифрования. Шифрование потребует наличия способа расшифровки информации до ее исходного значения (за исключением коллизий).

Глядя на ваш код, кажется, что он должен работать, если вы указываете правильный параметр.

  • Попробуйте сначала использовать литеральную строку в своем коде и проверьте ее достоверность вместо использования переменной $_POST[]

  • Попробуйте перенести сравнение из запроса к базе данных в код (получите хэш для данного пользователя и сравните с хешем, который вы только что вычислили)

Но самое главное, прежде чем развертывать это каким-либо публичным образом, не забудьте дезинфицировать ваши входные данные. Не допускайте вставки произвольного SQL в запросы. Лучшей идеей здесь будет использование параметризованных запросов.

person Yannick Motton    schedule 17.11.2009
comment
+1 за совет по проверке ввода. Параметризованные запросы обеспечивают большой контроль при минимальном дополнительном кодировании. - person Jeremy Morgan; 18.11.2009

Для защиты следует использовать адаптивное хеширование, например http://en.wikipedia.org/wiki/Bcrypt. пароли

person Edwin M    schedule 07.02.2014

Первым делом нужно провести сравнение функций SHA и выбрать наиболее безопасный алгоритм. который поддерживает ваш язык программирования (PHP).

Затем вы можете изучить официальную документацию, чтобы реализовать функцию hash(), которая получает в качестве аргумента выбранный вами алгоритм хеширования и необработанный пароль.

sha256 => 64 bits sha384 => 96 bits sha512 => 128 bits

Чем надежнее алгоритм хеширования, тем выше стоимость хеширования и времени на восстановление исходного значения со стороны сервера.

$hashedPassword = hash('sha256', $password);
person Braian Coronel    schedule 28.09.2018
comment
Понижено, потому что вводит в заблуждение. Хеширование — это не шифрование. И никакой "расшифровки" тоже нет. - person Leigh Bicknell; 20.03.2019
comment
@LeighBicknell Обновлено - person Braian Coronel; 20.03.2019

Лучшее решение — просто использовать отличный скрипт совместимости от Энтони Феррары:

https://github.com/ircmaxell/password_compat

Пожалуйста, а также при проверке пароля всегда добавляйте способ (предпочтительно асинхронный, чтобы он не влиял на процесс проверки на тайминг-атаки) для обновления хеша при необходимости.

person Luis Ferro    schedule 04.07.2017