2015-12-15 2 views
0

Как я могу вставить хешированный пароль в базу данных вместо открытого текста?Как вставить хеш-пароль в базу данных?

(Я попытался заменить '?' На 'SHA2 ('? ', 256') ').

Включите некоторые объяснения, спасибо!

$query= $con->prepare("INSERT INTO `useracct` (`email`, `password`, `name`) VALUES (?,?)"); 
$email = $_POST["email"]; 
$psswd = $_POST["passd"]; 
$name = $_POST["name"]; 

$query->bind_param('bb', $email, $psswd, $name); 
if ($query->execute()) { 
    echo "Query executed."; 
}else{ 
    echo "Query error."; 
} 
+3

Вы вставляете для 3 столбцов ('email',' password', 'name'), но имеете только 2 заполнителя и только привязываете 2 значения - это приведет к ошибке выполнения –

+0

' $ psswd = hash ($ _ POST ["passd"]); 'и остальные почти такие же. –

+1

'echo" Querry error. ";' Это вам не поможет. 'mysqli_error ($ con)' будет. –

ответ

3

Вы можете попробовать:

$query= $con->prepare("INSERT INTO `useracct` (`email`, `password`, `name`) VALUES (?,?,?)"); 
$email = $_POST["email"]; 
$psswd = PASSWORD_HASH($_POST["passd"], PASSWORD_DEFAULT); 
$name = $_POST["name"]; 

$query->bind_param('bbb', $email, $psswd, $name); 
if ($query->execute()) { 
    echo "Query executed."; 
} else{ 
    echo "Query error."; 
} 

Я использовал PASSWORD_HASH функцию РНР хэш пароля и эта функция поддерживается в PHP 5.5 и более поздних. Более подробную информацию здесь: http://php.net/manual/en/ref.password.php

Другой способ хэширования пароля является crypt() функция PHP, которая поддерживается начиная с PHP 4. Более подробную информацию можно найти здесь: http://php.net/manual/en/function.crypt.php

+0

@ Fred-ii- спасибо, что вы упомянули об этом :) – Rehmat

+3

Это * попробуйте этот * ответ. Я заметил редактирование, но было бы полезно дать объяснение ;-) –

0

Заменить ниже

$query->bind_param('bb', $email, $psswd, $name); 

в

$query->bind_param('bbb', $email, $psswd, $name); 

Поскольку вы используете три переменные, вы должны использовать три типа данных также.

+0

вопрос есть, * почему * они должны заменить его ;-) –

+0

@ Fred-ii- обновил мой ответ – Butterfly

0
$query= $con->prepare("INSERT INTO `useracct` (`email`, `password`, `name`) VALUES (?,?,?)"); //missing one parameter here 
$email = $_POST["email"]; 
$psswd = $_POST["passd"]; 
$hash = password_hash($password, PASSWORD_DEFAULT); 
$name = $_POST["name"]; 
$query->execute([$email, $hash, $name]); 
+1

не могли бы вы дать миру объяснение здесь, пожалуйста? заранее спасибо ;-) –

0

Использование PASSWORD_HASH для hasing

$query= $con->prepare("INSERT INTO `useracct` (`email`, `password`, `name`) VALUES (?,?,?)"); 
$email = $_POST["email"]; 
$psswd = $_POST["passd"]; 
$name = $_POST["name"]; 

$query->bind_param('bbb', $email, PASSWORD_HASH($psswd, PASSWORD_DEFAULT), $name); 
if ($query->execute()) { 
    echo "Query executed."; 
}else{ 
    echo "Query error."; 
} 

Для использования проверки

// See the password_hash() example to see where this came from. 
$hash = '$2y$07$BCryptRequires22Chrcte/VlQH0piJtjXl.0t1XkA8pw9dMXTpOq'; 

if (password_verify('rasmuslerdorf', $hash)) { 
    echo 'Password is valid!'; 
} else { 
    echo 'Invalid password.'; 
} 
0
$psswd = $_POST["passd"]; 
$psswd1 =password_hash("passwd"); 

использование так и при использовании запроса $psswd1 вместо $psswd

+3

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

+2

Вы действительно не должны использовать [хэши паролей MD5] (http://security.stackexchange.com/questions/19906/is-md5-considered-insecure). Для обеспечения безопасности паролей используйте встроенные функции PHP (http://jayblanchard.net/proper_password_hashing_with_PHP.html). Если вы используете версию PHP менее 5.5, вы можете использовать 'password_hash()' [пакет совместимости] (https://github.com/ircmaxell/password_compat). –

-1

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

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

Затем вы сохраняете пароль как любую другую строку. Существует несколько способов хеширования пароля, и обычно вы хотите сохранить хешированный пароль и соль.

Например:

$salt = bin2hex(random_bytes(16)); 
$passwordHash = sha1('123456' . $salt); 

Тогда ваш запрос будет что-то вроде следующего содержания:

INSERT INTO ... (..., password, salt) VALUES (..., $passwordHash, $salt) 

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

Редактировать: См. Комментарий Дж. Бланшара для более современного метода с использованием функций, встроенных в PHP, начиная с 5.5.

+3

Для обеспечения безопасности паролей воспользуйтесь встроенными функциями PHP (http://jayblanchard.net/proper_password_hashing_with_PHP.html). Если вы используете версию PHP менее 5.5, вы можете использовать 'password_hash()' [пакет совместимости] (https://github.com/ircmaxell/password_compat). –

+0

Сладкий, не знал о 'password_hash'. Обратите внимание, что с 'password_hash' не требуется отдельное поле для соли; соль хранится в том же поле, что и пароль. 'password_verify' автоматически определит, какая часть строки - хеш и что такое соль. – siimsoni

+0

Правильно, с бонусом .... каждая соль * случайная *. –

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