Расшифруйте шифрование хэша sha256, зная соль

Я делаю входа в систему для веб-приложения. Для хранения паролей в БД я шифрую пароли с помощью sha256 следующим образом:

$salt ="sometext";
$escapedPW="userpass";
$saltedPW =  $escapedPW . $salt;
$hashedPW = hash('sha256', $saltedPW);
echo "<center>".$hashedPW."</center>";

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

мой вопрос есть ли способ, которым я могу отправить вам фактический пароль пользователя и не шифрование пароля, т. е. есть какой-то способ сделать обратное sha256, если я знаю соль?. Если это невозможно, какой метод шифрования рекомендуется для завершения обратного ключа шифрования и отправки фактического пароля пользователю по электронной почте.

2 ответов


как упоминалось в комментариях к вашему вопросу, обращение хэша на самом деле не является вариантом.

что вы можете сделать, однако, и это то, что делают все остальные. В вашем регистрационном коде (ex. реестр.php), который вы можете отправить в своей форме, вы можете заставить PHP-скрипт отправить пароль по электронной почте, а затем зашифровать его и сохранить в базе данных.

Я полагаю, у вас есть какая-то регистрационная форма, и эта форма предположительно публикует новые данные пользователей другой (или тот же) PHP-скрипт, не так ли?

например, если моя форма говорит что-то вроде <form method="post" action="register.php">

и register.php у меня тогда было бы что-то вроде

<?php
$username = mysql_real_escape_string($_POST['username']);
$password = mysql_real_escape_string($_POST['password']); /*cleartext*/
$email    = mysql_real_escape_string($_POST['email']);

mail($email,"New account","Your username \"$username\" and your password is \"$password\"");

$salt ="sometext";
$escapedPW="userpass";
$saltedPW =  $escapedPW . $salt;
$hashedPW = hash('sha256', $saltedPW);

mysql_query("INSERT INTO users (username, password, email) VALUES ($username, $hashedPW, $email)")

некоторый пример кода. Надеюсь, это поможет!


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

вы должны не используйте простой хэш, как предложил @Henrik. Используйте стандартный регулируемый рабочий пароль KDF (PBKDF2,bcrypt,scrypt)

Если вы можете использовать PHP 5.5, используйте стандартные функции хэширования паролей. Есть хосты, которые поддерживают PHP 5.5, но вы должны искать их и спрашивать для него.

есть много мест в интернете, которые объясняют, как это сделать правильно (например,https://wiki.mozilla.org/WebAppSec/Secure_Coding_Guidelines#Authentication) и многие, которые объясняют, как это сделать неправильно. Пожалуйста, потратьте некоторое время, чтобы изучить это, прежде чем вы решите свернуть свою собственную систему аутентификации.