Вероятно, очень новичок вопрос, но, я читал и нашел некоторые трудности в понимании создания и хранения паролей. Из того, что я прочитал, md5 / хэш-пароли – лучшие способы их хранения в базе данных. Однако, как бы я начал создавать эти пароли в первую очередь?
Так скажите, что у меня есть страница входа в систему с пользователем bob и пароль bob123 – как я получу пароль bobs в базу данных, чтобы начать с (хэширование). 2. Как я могу восстановить и подтвердить хешированный пароль?
благодаря
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
вы должны рассуждать с точки зрения пароля:
храните пароль как 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
Пожалуйста, не используйте MD5 для хеширования паролей. Такие пароли могут быть взломаны в миллисекундах. Вы, несомненно, будете нарисованы киберпреступниками.
PHP предлагает высококачественную и надежную подсистему хэширования пароля на основе надежной случайной соли и нескольких раундов шифрования Rijndael / AES.
Когда пользователь сначала предоставляет пароль, вы можете хешировать его так:
$pass = 'whatever the user typed in'; $hashed_password = password_hash( "secret pass phrase", PASSWORD_DEFAULT );
Затем сохраните $hashed_password
в $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, вы можете использовать метод MySQL MD5 () тоже ….
SELECT * FROM user WHERE Password='. md5($password) .'
или SELECT * FROM ser WHERE Пароль = MD5 ('. $ password.')
Чтобы вставить его, вы можете сделать это одинаково.
Почему бы вам не использовать MySQL, встроенный в 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. Затем при выполнении регистрации вы создаете уникальный хеш для этого конкретного пароля.
Все это заканчивается: двумя паролями, которые написаны точно так же, будут иметь два разных хэша. Уникальный хэш сохраняется в базе данных вместе с текущим идентификатором. Если кто-то возьмет базу данных, у них будет каждая уникальная соль для каждого конкретного пароля. Но то, чего у них нет, – это ваша статическая соль, которая делает вещи намного сложнее для каждого «хакера».
Вот как вы проверяете правильность своего пароля на 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 в код выше.