Как создать и сохранить пароли md5 в mysql

вероятно, очень новичок вопрос, но, я читал вокруг и нашли некоторые трудности в понимании создания и хранения паролей. Из того, что я прочитал, MD5/хэш-пароли-лучшие способы хранения их в базе данных. Однако, как бы я идти о создании этих паролей в первую очередь?

так сказать, у меня есть страница входа с пользователем bob и пароль bob123 - как я 1. получите пароль bobs в базу данных для начала (хешированный) 2. как мне повторить и подтвердить хэшированный пароль?

спасибо

9 ответов


Edit 2017/11/09: обязательно взгляните на ответ от O Jones.

во-первых, MD5 не самый большой метод хеширования, который вы могли бы использовать для этой попытки sha256 или sha512

сказал, что позволяет использовать hash('sha256') вместо md5() для представления хэширующей части процесса.

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

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

$escapedName = mysql_real_escape_string($_POST['name']); # use whatever escaping function your db requires this is very important.
$escapedPW = mysql_real_escape_string($_POST['password']);

# generate a random salt to use for this account
$salt = bin2hex(mcrypt_create_iv(32, MCRYPT_DEV_URANDOM));

$saltedPW =  $escapedPW . $salt;

$hashedPW = hash('sha256', $saltedPW);

$query = "insert into user (name, password, salt) values ('$escapedName', '$hashedPW', '$salt'); ";

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

$escapedName = mysql_real_escape_string($_POST['name']);
$escapedPW = mysql_real_escape_string($_POST['password']);

$saltQuery = "select salt from user where name = '$escapedName';";
$result = mysql_query($saltQuery);
# you'll want some error handling in production code :)
# see http://php.net/manual/en/function.mysql-query.php Example #2 for the general error handling template
$row = mysql_fetch_assoc($result);
$salt = $row['salt'];

$saltedPW =  $escapedPW . $salt;

$hashedPW = hash('sha256', $saltedPW);

$query = "select * from user where name = '$escapedName' and password = '$hashedPW'; ";

# if nonzero query return then successful login

вы должны рассуждать с точки зрения hased пароля:

сохранить пароль как md5('bob123'); когда Боб зарегистрируется в вашем приложении

$query = "INSERT INTO users (username,password) VALUES('bob','".md5('bob123')."');

затем, когда Боб входит в:

$query = "SELECT * FROM users WHERE username = 'bob' AND password = '".md5('bob123')."';

obvioulsy используйте переменные для имени пользователя и пароля, эти запросы генерируются php, а затем вы можете выполнить их на mysql


пожалуйста, не используйте MD5 для хэширования паролей. Такие пароли можно взломать за миллисекунды. Киберпреступники наверняка тебя накажут.

PHP предлагает высококачественная и будущая подсистема хэширования паролей на основе надежной случайной соли и нескольких раундов шифрования Rijndael / AES.

когда пользователь впервые предоставляет пароль, вы можете хэш вроде этого:

 $pass = 'whatever the user typed in';
 $hashed_password = password_hash( "secret pass phrase", PASSWORD_DEFAULT );

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

 $pass = 'whatever the user typed in';
 $hashed_password = 'what you retrieved from MySQL for this user';
 if ( password_verify ( $pass , $hashed_password )) {
    /* future proof the password */
    if ( password_needs_rehash($hashed_password , PASSWORD_DEFAULT)) {
       /* recreate the hash */
       $rehashed_password = password_hash($pass, PASSWORD_DEFAULT );
       /* store the rehashed password in MySQL */
     }
     /* password verified, let the user in */
 }
 else {
     /* password not verified, tell the intruder to get lost */
 }

как работает эта будущая проверка? Будущие выпуски PHP будут адаптироваться, чтобы соответствовать быстрее и проще взломать шифрование. Если необходимо перефразировать пароли, чтобы сделать их сложнее взломать, будущая реализация password_needs_rehash() функция обнаружит это.

не изобретать колесо. Использовать профессионально разработанный и проверенный открытый исходный код для обеспечения безопасности.


вставка:

INSERT INTO ... VALUES ('bob', MD5('bobspassword'));

извлечение:

SELECT ... FROM ... WHERE ... AND password=md5('hopefullybobspassword');

как бы вы это сделали непосредственно в запросах. Однако, если ваш MySQL имеет журнал запросов включен, то открытый текст паролей будет записан в этот журнал. Так... вы хотите выполнить преобразование MD5 в своем скрипте, а затем вставить полученный хэш в запрос.


PHP имеет метод md5; -) просто $ password = md5 ($passToEncrypt);

Если вы ищете в SQL, u может использовать метод MySQL MD5 () тоже....

 SELECT * FROM user WHERE Password='. md5($password) .'

или Выберите * из ser, где Password=MD5 ('. $пароль. ')

вставить его вы можете сделать это таким же образом.


почему бы вам не использовать MySQL, встроенный в password hasher:

http://dev.mysql.com/doc/refman/5.1/en/password-hashing.html

mysql> SELECT PASSWORD('mypass');
+-------------------------------------------+
| PASSWORD('mypass')                        |
+-------------------------------------------+
| *6C8989366EAF75BB670AD8EA7A7FC1176A95CEF4 |
+-------------------------------------------+

для сравнения вы могли бы что-то вроде этого:

select id from PassworTable where Userid='<userid>' and Password=PASSWORD('<password>')

и если он возвращает значение, то пользователь прав.


Я не удивителен в PHP, но я думаю, что это то, что вы делаете:

$password = md5 ($password)

и $password будет $_POST['password'] или как там


просто получите хэш следующей строкой и сохраните его в базе данных:

$encryptedValue = md5("YOUR STRING");

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

вот как вы можете генерировать соль, строку md5 и хранить:

    $unique_salt_string = hash('md5', microtime()); 
    $password = hash('md5', $_POST['password'].'static_salt'.$unique_salt_string);
    $query = "INSERT INTO users (username,password,salt) VALUES('bob','".$password."', '".$unique_salt_string."');

теперь у вас есть статический соли, которая действительна для всех ваших паролей, которые хранятся в .PHP-файл. Затем при выполнении регистрации вы создаете уникальный хэш для этого конкретного пароль:.

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

вот как вы проверяете действительность своего пароля при входе в систему.php для пример:

     $user = //username input;
     $db_query = mysql_query("SELECT salt FROM users WHERE username='$user'");
     while($salt = mysql_fetch_array($db_query)) {
            $password = hash('md5',$_POST['userpassword'].'static_salt'.$salt[salt]);
}

этот метод очень мощный и безопасный. Если вы хотите использовать шифрование sha512, просто поместите его в хэш-функцию вместо md5 в приведенном выше коде.