Я хочу иметь довольно безопасный логин на моем сайте.
Я решил использовать 3 входа для моей формы. Имя пользователя и пароль для входа в вашу учетную запись и имя пользователя, которое будет отображаться на веб-сайте. Так что, если кто-то получит доступ к столу, ему нужно будет грубо взломать Логин и Пароль.
Могу ли я использовать password_hash()
для имени входа или я должен использовать нормальный hash()
-ин?
То, что вы, скорее всего, в конечном итоге будете делать, это две таблицы.
Одна таблица будет содержать данные пользователя, то есть уникальный идентификатор пользователя, имя пользователя, имя и т. Д. Имя пользователя, имя, адрес электронной почты будут зашифрованы.
Вторая таблица будет хеш-таблицей. Это таблица, которую вы будете использовать для проверки имени пользователя и пароля пользователя. Он должен иметь уникальный идентификатор пользователя, хешированное (без IV) значение имени пользователя, а затем ваш пароль, который вы будете использовать password_verify()
проверить.
Когда ваш пользователь входит в систему, он предоставит свое имя пользователя и пароль. Имя пользователя будет хешироваться тем же процессом без IV, чтобы позволить хешу всегда равняться хешу, который хранится в хеш-таблице для имени пользователя этого пользователя. Это позволит вам запросить соответствующую запись для проверки пароля. Проверьте свой пароль с помощью password_verify()
функция.
После проверки имени пользователя и пароля вы убедились, что у вашего пользователя есть соответствующие учетные данные, и вы сделаете второй запрос, используя уникальный идентификатор пользователя в первой таблице. Когда ваш запрос возвращает данные, это будут зашифрованные значения для этого пользователя, расшифруйте, и вы готовы отобразить информацию о пользователе для пользователя.
Если я получу доступ к вашим таблицам, я никогда не увижу информацию вашего пользователя. Я мог бы видеть уникальный идентификатор пользователя и увидеть, что идентификатор совпадает с идентификатором в обеих таблицах, но при этом все значения либо хешируются, либо шифруются.
Я очень рекомендую использовать Библиотека Libsodium делать хеширование и шифрование. (Пусть встроенные функции паролей php позаботятся обо всех ваших паролях.) Libsodium теперь поддерживается изначально в последних версиях PHP.
Предполагается, что ваши таблицы и файловые каталоги вашего сервера находятся на двух физически разных машинах. Это потому, что вы будете хранить ключи шифрования в своем каталоге, в идеале под корневым каталогом. Если ваш сервер скомпрометирован, они не имеют прямого доступа к вашим таблицам, а если ваши таблицы скомпрометированы, у них нет доступа к вашим ключам.
Надеюсь, это заставит вас двигаться в правильном направлении.
обновленный
Вот простая процедура шифрования / дешифрования, которая зашифрует имя пользователя без IV. Это означает, что до тех пор, пока ключ остается неизменным, он будет каждый раз шифровать один и тот же простой текст в один и тот же зашифрованный текст. Это позволит вам запрашивать зашифрованный текст относительно того же зашифрованного текста в вашей базе данных.
define("MYKEY_", base64_decode('LoPCPKd8iDxHvb8mATzhhg=='));
function encryptName($plainText) {
return base64_encode(openssl_encrypt($plainText, 'AES-128-CBC', MYKEY_, OPENSSL_RAW_DATA, NULL));
}
function decryptName($cipherText) {
return openssl_decrypt(base64_decode($cipherText), 'AES-128-CBC', MYKEY_, OPENSSL_RAW_DATA, NULL);
}
$text = 'myUserName';
$cipherText = encryptName($text);
echo $cipherText . '<br>';
$plainText = decryptName($cipherText);
echo $plainText;
Других решений пока нет …