Подтвердить что ты не робот

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

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

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

Спасибо

4b9b3361

Ответ 1

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

Ответ 2

вы должны рассуждать в терминах hased password:

сохраните пароль как 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')."';

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

Ответ 3

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

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

Ответ 4

Вставка:

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

поиска:

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

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

Ответ 5

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

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

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

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

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

Ответ 6

Почему бы вам не использовать встроенный в MySQL 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>')

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

Ответ 7

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

$password = md5 ($ password)

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

Ответ 8

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

$encryptedValue = md5("YOUR STRING");

Ответ 9

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