Функция пароля MySQL
Является ли хорошей или плохой практикой использование функции паролей MySQL для хэш-паролей, используемых приложением? Я вижу плюсы и минусы. Мне любопытно, существует ли общее мнение о том, хорошо это или плохо.
Ответы
Ответ 1
Документы для MySQL PASSWORD():
Функция PASSWORD() используется системой аутентификации в MySQL Server; вы не должны использовать его в своих приложениях.
Прочитайте " Вероятно, вы храните пароли неверно, чтобы лучше советоваться с хэшированием и хранением паролей.
MD5 и SHA-1 считаются слишком слабыми для использования для паролей. В настоящее время рекомендуется использовать SHA-256.
Я внес пакет в MySQL для поддержки функции SHA2()
, и патч был принят, но поскольку их дорожная карта изменила его, очистить, когда он превратится в выпущенный продукт.
Тем временем, вы можете использовать хэширование и соление на вашем языке программирования и просто хранить хэш-результат результата в базе данных. Если вы используете PHP, SHA-256 доступен в hash()
.
обновление: MySQL 5.5.8 был выпущен в декабре 2010 года, и этот выпуск содержит поддержку SHA2()
.
Ответ 2
Если вы используете функцию базы данных для хеш-паролей, то по определению они должны поступать в базу данных unhashed: поэтому я бы предпочел сделать это намного ближе к "источнику", то есть во внешнем приложении, чтобы вы не проходили мимо открытая информация.
Ответ 3
Я считаю, что фактическая функция PASSWORD
в MySQL небезопасна и была сломана, но я не могу найти ссылку на данный момент. Я знаю, что старший (OLD_PASSWORD
в 5 и выше) определенно небезопасен.
Конечно, все пароли всегда должны храниться с солью (для дальнейшего безвестности). Пример:
UPDATE users SET password=MD5(CONCAT('salt', 'user provided value')) WHERE id=54
Существует также функция MD5
, но с ростом колоссальных радужных таблиц она не на 100% надежна как способ полного обфускации сохраненных паролей.
Лучший метод - это хеширование пароля (с солью), прежде чем он достигнет базы данных. Пример:
<?php
$password = sha1(SALT.$_POST["password"]);
$sql = "UPDATE users SET password='".$password."' WHERE id=54";
?>