Нет, вы не должны использовать свое собственное хеширование пароля для аутентификации MySQL.
MySQL использует свою собственную функцию хеширования пароля (PASSWORD()
), которая генерирует 41-байтовую шестнадцатеричную строку (основанную на применении SHA1 ко входу дважды). К сожалению, соль не используется.
Если бы вы могли использовать GRANT
так, как вы указали в своем вопросе, MySQL применил бы свою функцию PASSWORD()
к строковому выводу функции hash()
. Впоследствии, когда вы захотите войти, вам нужно будет ввести 256-битный хеш вашего пароля, чтобы он соответствовал тому, что находится в базе данных аутентификации MySQL.
Кроме того, MySQL поддерживает семейство хэш-функций SHA2()
, начиная с MySQL 6.0.5.
Функция hash()
- это то, что вы, вероятно, помните из PHP. Он не является частью MySQL.
обновление: я посетил конференцию MySQL на этой неделе и обнаружил, что они полностью меняют свой план для номеров будущих версий продукта. Функция SHA2()
в настоящее время является частью источника MySQL, но она не определяет, какой версии продукта соответствует. Кроме того, вам нужен MySQL, созданный с поддержкой OpenSSL / YaSSL, чтобы SHA2()
работал.
Ваш комментарий: Обычно аутентификация MySQL полностью отделена от аутентификации учетной записи пользователя в данном веб-приложении (это рекомендуется по нескольким причинам).
Да, вам нужно жестко указать имя пользователя / пароль для аутентификации MySQL для вашего веб-приложения. Может быть в, но еще лучше был бы файл конфигурации. Разумеется, поместите их вне корня сети.
Когда пользователю необходимо войти в систему, вычислите hash()
его входного пароля в сочетании со значением salt в записи для его учетной записи. Затем сравните это с хешем, хранящимся в базе данных для этого пользователя. В псевдокоде:
$salt = $db->query("SELECT salt FROM Accounts WHERE account_name = ?",
$input_account_name);
$password_hash = hash('sha256', $salt + $input_password)
$is_password_correct = $db->query("SELECT password_hash = ?
FROM Accounts WHERE account_name = ?",
$password_hash, $input_account_name);