Information
- Rating
- 2,751-st
- Location
- Санкт-Петербург, Санкт-Петербург и область, Россия
- Date of birth
- Registered
- Activity
Specialization
Backend Developer
Middle
C#
Multiple thread
Object-oriented design
Software development
SQL
ASP.Net
PostgreSQL
Linux
MongoDB
Тем не менее, как заметил пользователь RubtsovAV, если соль не задавать (не параметр функции crypt(), а именно соль в строке $2a$cost$salt), то по-умолчанию будет использоваться строка, состоящая из знаков $. Так что не указывать соль, как предлагает Lockal, нельзя.
Хотя бы открывал. И там ничего не сказано о том, что bcrypt сам генерирует соль. Напротив, там указан такой формат вызова функции:
bcrypt(cost, salt, key, input)
, где input, при использовании стандартной функции crypt() в различных ОС равен константе «OrpheanBeholderScryDoubt».Как видим, параметр salt очень даже присутствует.
И зачем же Вам в Вашем приложении нужен код, который приводит к непредсказуемому результату?!
Посмотрите вот этот комментарий: habrahabr.ru/post/145648/#comment_4894759 и дискуссию, возникшую на его основе.
А вот ситуацию, при которой с сайта крадут базу данных, чтобы найти пароль какого-то одного пользователя, мне как-то сложно представить — цель не оправдывает средства.
Если хакера интересует один конкретный пользователь, то, естественно, выигрыша нет. И если в системе предполагается лишь один пользователь, то соль можно хранить хоть в конфиге, хоть в самом коде (хотя это и не гибко).
Ну а если у вас в системе предполагается много пользователей, то хоть тут-то Вы видите преимущества разной соли для каждого пользователя?
Нет, не так. По-умолчанию всегда считаем, что алгоритм известен.
Т.е., по-Вашему, нет разницы, применить ли один раз брутфорс и тем самым получить пароли всех пользователей сразу, или для каждого пользователя запускать брутфорс заново? По-моему, очевидно, что во втором случае хакер потеряет времени больше во столько раз, сколько в базе пользователей!
Т.е. если у нас одна соль на всех, и хакер может генерировать радужную таблицу для словаря и недлинных алфавитно-цифровых паролей за 7 дней, то именно 7 дней у него уйдет на взлом всех пользователей. Если же соль для каждого пользователя разная, то 7 дней (ну чуть меньше) у хакера уйдет на взлом одного пользователя! А если пользователей 1000, то на из взлом потребуется уже 7000 дней, т.е. почти 20 лет!
А если еще и использовать действительно медленный алгоритм для получения хэша пароля, чтобы в секунду хакер мог генерировать не миллионы значений, а сотни или даже десятки, то и одного пользователя таким образом взломать будет за приемлемое время невозможно.
1. Нет соли — используем уже готовые радужные таблицы.
2. Есть одна на всех соль — генерируем одну радужную таблицу и «ломаем» по ней всех пользователей.
3. Есть отдельная соль для каждого пользователя — отдельно брутфорсим каждого пользователя.
Какой смысл использовать шифр Anubis — я не знаю. Возможно, кто-нибудь найдет ему применение, почему бы и нет?
Зато я знаю, что для меня был смысл писать эту реализацию — опыт, расширение кругозора. В частности, пока все сам не сделал, я не совсем понимал, что значит CBC и зачем он нужен, что можно сделать с последним блоком, зачем нужен какой-то вектор инициализации, и т.п.
Хотя, конечно, в реальности нужно использовать что-либо более проверенное и признанное. Например, AES. Тем более, что в PHP это делается очень просто, используя функции расширения Mcrypt.