Могу ли я использовать PASSWORD_HASH для имен входа?

Я хочу иметь довольно безопасный логин на моем сайте.
Я решил использовать 3 входа для моей формы. Имя пользователя и пароль для входа в вашу учетную запись и имя пользователя, которое будет отображаться на веб-сайте. Так что, если кто-то получит доступ к столу, ему нужно будет грубо взломать Логин и Пароль.

Могу ли я использовать password_hash() для имени входа или я должен использовать нормальный hash() -ин?

1

Решение

То, что вы, скорее всего, в конечном итоге будете делать, это две таблицы.

Одна таблица будет содержать данные пользователя, то есть уникальный идентификатор пользователя, имя пользователя, имя и т. Д. Имя пользователя, имя, адрес электронной почты будут зашифрованы.

Вторая таблица будет хеш-таблицей. Это таблица, которую вы будете использовать для проверки имени пользователя и пароля пользователя. Он должен иметь уникальный идентификатор пользователя, хешированное (без 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;
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]