2014-02-05 1 views
0

Мне интересно, какая система должна генерировать хэш и соль для безопасного веб-приложения.Безопасно создавать хэш и соль внутри триггера базы данных?

Есть 3 варианта в моей установке:

  • (Javascript) клиент
  • PHP сервер
  • MySQL сервер

На данный момент я реализовал его в MySQL- сервер внутри триггера. Что он делает - это взять неподдерживаемый/нераскрытый пароль в поле под названием «PasswordHash», когда новый пользователь создан, поэтому исходный пароль находится в операторе INSERT.

Но в INSERT Перед запуском этот пароль хэшируется (SHA1) со случайной солью (UUID), которая объединена с хешем в переменной @hashandsalt. (Я уже выяснил, что на самом деле неплохо хранить хэш и соль в отдельных столбцах).

Затем я делаю SET NEW.PasswordHash = @hashandsalt;, поэтому исходный пароль никогда не записывается в базу данных, а заменяется хешей + солью.

Это хорошая идея?

Я вижу проблему с протоколированием MySQL, потому что все занесено в журнал INSERT-инструкции таблицы пользователей содержат исходные пароли. В настоящий момент я не использую регистрацию MySQL по умолчанию, но на самом деле я не уверен, как MySQL хранит все входящие операторы внутри.

Что, по вашему мнению, было бы лучшим вариантом для создания хэша и соли?

+0

Предоставляет ли ваша база данных CSPRNG или какой-либо надежный и безопасный источник случайности? Если нет, вам нужно будет генерировать соль из PHP (используя криптографически сильный источник случайности) – DavidO

+0

Я понятия не имею, что такое CSPRING ... Я просто использую функцию UUID() как соль, которая производит что-то вроде: 5bf721f7 -8e1e-11e3-ab83-00163e54cd45 – Dylan

+0

http://stackoverflow.com/questions/536584/non-random-salt-for-password-hashes – DavidO

ответ

1

Лучшим способом было бы использовать функцию PHP, которая хэширует пароль для вас.

Если у вас есть PHP => 5.5.0, вы можете использовать Password extension. Он обрабатывает все для вас, так что вам не нужно об этом думать. Если вы не специалист в области мышления слишком много об этом, совершенно откровенно, не очень хорошая идея.

$password = filter_input(INPUT_POST, 'password', FILTER_UNSAFE_RAW); 
$hashed = password_hash($password, PASSWORD_BCRYPT); 
// Done! 

Если у вас есть PHP < 5.5.0, то есть несколько вариантов, среди них:

  1. Используйте кнопки compatibility library на мр. Anthony Ferrara.
  2. Используйте другую библиотеку (например, PHPass).
  3. Используйте функцию crypt() (она немного надоедливым использовать, но работает отлично)

Что касается Javascript, нет. Просто нет. Хеширование паролей должно быть невидимым для клиента, и никогда не будет покинуть внутреннюю сеть.

Выполнение этого в SQL может работать, но я не думаю, что это такая хорошая идея, особенно, если вы написали это самостоятельно.Не обижайтесь, но написание собственных алгоритмов хеширования редко бывает хорошей идеей; вы должны использовать алгоритмы, написанные людьми, которые знают, что они делают, и которые были проверены экспертами другими экспертами.

+0

Спасибо, я решил, что использование триггера SQL было довольно творческим, но после читайте о password_hash(), password_verify() и bcrypt. Я согласен, что это намного лучший вариант. – Dylan

Смежные вопросы