Как использовать sha256 в php5.3.0 - PullRequest
35 голосов
/ 18 ноября 2009

Я использую 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());

Что-то не так? Я очень смущен. Благодарю.

Ответы [ 5 ]

56 голосов
/ 18 ноября 2009

Может ли это быть опечатка? (два Ps в ppasscode, предназначены?)

$_POST['ppasscode'];

Я бы обязательно и сделал:

print_r($_POST);

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

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

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

  1. Получение пароля из формы
  2. хеширование пароля
  3. сохраненный пароль
  4. сравнение двух.
11 голосов
/ 18 ноября 2009

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

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

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

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

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

1 голос
/ 28 сентября 2018

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

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

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

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

$hashedPassword = hash('sha256', $password);
1 голос
/ 07 февраля 2014

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

0 голосов
/ 04 июля 2017

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

https://github.com/ircmaxell/password_compat

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

...