Как создать пользователя MySQL с помощью хэша ('sha256', $ salt. $ password)? - PullRequest
4 голосов
/ 28 марта 2009

Я, должно быть, что-то упустил.

Я хочу настроить учетную запись пользователя базы данных для транзакций только для выбора, но mysql не позволяет мне выбирать метод хеширования для пароля при создании учетной записи пользователя.

это не удалось:

GRANT SELECT ON myDB.* TO 'selectuser'@'localhost' 
IDENTIFIED BY hash('sha256', 'salted-myfakelongrandompasswordstring');

ОШИБКА 1064 (42000): у вас ошибка в синтаксисе SQL; проверьте руководство, соответствующее вашей версии сервера MySQL, на предмет правильного синтаксиса для использования рядом с хешем (sha256, salted-myfakelongrandompasswordstring ')' в строке 1

это проходит:

GRANT SELECT ON myDB.* TO 'selectuser'@'localhost' 
IDENTIFIED BY 'salted-myfakelongrandompasswordstring';

Я проверил страницу phpinfo, и механизм хеширования sha256 уже включен.

есть ли способ изменить алгоритм хеширования по умолчанию для mysql, или синтаксис просто неверен в моем SQL?

Ответы [ 2 ]

4 голосов
/ 28 марта 2009

Нет, вы не должны использовать свое собственное хеширование пароля для аутентификации 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);
1 голос
/ 28 марта 2009

Эта страница документации , кажется, указывает, что sha256 не реализован в MySQL:

Также в отношении упомянутого подвига Sha1, есть более сильные версии как sha256, sha384, sha512 и т. д., но MySQL не реализует их; Oни должно быть реализовано в коде.

...