Хеширование (с солями) имени пользователя и пароля в php

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

Вот что я думал сделать...

  • Хэширование имени пользователя с использованием двух хешированных солей, основанных на подстроках имени пользователя.
  • Хеширование пароля с использованием 2 случайно сгенерированных хешированных солей, которые хранятся в таблице с паролем и именем пользователя.

Является ли это излишним, неправильным или даже недостаточно безопасным?


person Tom    schedule 05.07.2012    source источник
comment
Изобретите велосипед заново или повторно используйте чужой код openwall.com/phpass   -  person Imre L    schedule 05.07.2012
comment
Воспользуйтесь советом @ImreL. Используйте библиотеку, например phppass или PasswordLib, которые генерируют надежные хэши.   -  person Leigh    schedule 05.07.2012
comment
Изобретите велосипед или повторно используйте чужой код № 2 php-login.net   -  person Sliq    schedule 09.07.2012


Ответы (6)


Соление защищает от радужных таблиц, поэтому наличие 2 солей не будет лучше, чем 1. Хакеру нужно знать соль, чтобы взломать ваш пароль с помощью радужной таблицы, единственный способ, которым он может это сделать, — это иметь доступ к таблице базы данных. И если у них есть это, у них в любом случае есть обе соли.

Чем длиннее пароль, тем сложнее будет сделать это с помощью грубой силы, поэтому более длинный пароль будет лучше, чем лишняя соль.

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

В идеале используйте что-то вроде BCrypt, где функция криптографического хеширования может адаптивно замедляться с течением времени, как закон Мура продолжается. Это уменьшит вероятность атаки грубой силы.

person marvc1    schedule 05.07.2012

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

Обязательно используйте безопасный алгоритм хеширования, например SHA-512.

person Rawkode    schedule 05.07.2012
comment
Итак, я думаю, что понял, что все говорят, что это излишество, но прав ли я, думая, что это не так или менее безопасно. - person Tom; 05.07.2012
comment
Конечно. Это скорее накладные расходы без повышения безопасности. - person Rawkode; 05.07.2012
comment
Рекомендуется использовать медленную хеш-функцию, такую ​​как bcrypt, другие хэши, даже если они технически безопасны, могут быть слишком быстрыми. - person martinstoeckli; 05.07.2012

Как уже говорили другие, хеширование имени пользователя является излишним, и достаточно одной соли. Используйте алгоритм, который математически медленный — он будет медленным и для взломщика.

person pamil    schedule 05.07.2012

Достаточно один раз посолить пароль. Наличие двух солей в основном эквивалентно созданию более длинной соли.

Хэширование имен пользователей усложнит управление пользователями, а не сделает вход в систему более безопасным. Подумайте о том, чтобы составить список ваших текущих пользователей, но все, что у вас есть, это хешированные версии? Помните, что смысл хеширования заключается в необратимом «шифровании» ваших данных.

Рассмотрите возможность использования crypt() для хэширования вашего пароля. Особо обратите внимание на метод Blowfish, так как в настоящее время он считается самым безопасным методом хеширования.

person Repox    schedule 05.07.2012

Я только что ответил на другой вопрос SO вдаваться в подробности о том, как обращаться с логинами и безопасностью паролей. Возможно, стоит прочитать. (Некоторые лакомые кусочки: имя пользователя не нужно солить. Пароль обязательно нужно солить, но один раз — это все, что вам нужно. Я использую SHA-256.)

person curtisdf    schedule 05.07.2012
comment
В вашем большом длинном посте не упоминаются функции создания ключей и их преимущества перед криптографическими хэшами. - person Leigh; 05.07.2012
comment
Спасибо за указание на KDF. Это ново для меня. Не стесняйтесь комментировать больше! - person curtisdf; 05.07.2012

На самом деле нет необходимости хэшировать поле имени пользователя, это должно быть то, что вы хотите отображать на веб-странице, сохраняя при этом безопасность вашей системы. При этом, хотя это и не нужно, это не повредит, если вы готовы с этим мириться.

Добавление двух солей довольно бессмысленно, если они обе происходят и хранятся в одном и том же месте. Вместо этого я бы использовал перестановку имени пользователя в качестве соли вместе с длинной случайной строкой, которую вы случайным образом генерируете и сохраняете в своей базе данных. Если вы все еще параноик (что, как я полагаю, вы из-за всего «хеширования имен пользователей»), я бы подумал о добавлении третьей соли, которую вы используете во всем своем приложении.

Также очень важно:

Убедитесь, что вы используете надежную хеш-функцию

Убедитесь, что вы используете безопасную хеш-функцию. водоворот, sha256 и выше, тигр или что-то еще, что вы можете использовать (проверьте hash_algos()). Также взгляните на реализацию bcrypt, которая очень медленная ( Как вы используете bcrypt для хеширования паролей в PHP?).

person Joseph Szymborski    schedule 05.07.2012