Как мне создать и хранить пароли MD5 в MySQL - PullRequest
23 голосов
/ 21 июля 2011

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

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

Спасибо

Ответы [ 9 ]

43 голосов
/ 22 июля 2011

Редактировать 2017/11/09: Обязательно взгляните на ответ О Джонс.

Во-первых, 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
9 голосов
/ 21 июля 2011

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

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

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

тогда, когда bob входит в систему:

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

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

7 голосов
/ 10 октября 2015

Пожалуйста, не используйте 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() обнаружит это.

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

5 голосов
/ 22 июля 2011

Вставка:

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

поиск:

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

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

3 голосов
/ 22 июля 2011

Почему бы вам не использовать встроенный в MySQL хэш пароля:

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>')

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

3 голосов
/ 21 июля 2011

В PHP есть метод с именем md5 ;-) Просто $ password = md5 ($ passToEncrypt);

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

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

или SELECT * FROM ser WHERE Пароль = MD5 ('. $ Password.')

Чтобы вставить его, вы можете сделать то же самое.

2 голосов
/ 21 июля 2011

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

$ пароль = md5 ($ пароль)

и $password будет $_POST['password'] или любым другим

0 голосов
/ 19 мая 2017

Чтобы еще больше повысить безопасность, вы можете использовать шифрование 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. Затем при выполнении регистрации вы генерируете уникальный хеш для этого конкретного пароля.

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

Вот как вы проверяете действительность вашего пароля на login.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 в приведенном выше коде.

0 голосов
/ 10 октября 2015

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

$encryptedValue = md5("YOUR STRING");
...