Разбор полетов по crypt CRYPT_BLOWFISH и возвращаемому значению

php55

Новичок
Приветствую всех комрады. В одном старом проекте потребовалось переделать алгоритм хеширования пассов на более надежный. Использовать буду crypt(), но тут у меня появился вопрос на который сам себе ответить не смог, наверное из за криворукости, так что попинайте малех че каво...

Имеем сей код:
Код:
$pass = '1234567';                          // пасс
$salt_local = '122asd45as54125';  // локальная соль, хранится в скрипте в константе
$salt_rand = rand(10000,99999);   // рандомная соль, хранится в бд, у каждого юзера своя

echo 'Salt - ' . $salt_rand . $salt_local .'\n';

echo 'Result - ' . crypt($pass, '$2a$07$' . $salt_rand . $salt_local . '$');
Salt - 80614122asd45as54125
Result - $2a$07$80614122asd45as54125$ef556kOY0c9hzQXCBPo6WB2oygjGjv.C

В итоге крипт результит мне по сути 3 вещи в одной строке:
- Параметры для крипта ($2a$07$)
- Соль (80614122asd45as54125)
- Хеш ($ef556kOY0c9hzQXCBPo6WB2oygjGjv.C)

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

И как быть с этой траблой? Парсить ручками строку и тащить от туда сгенереный хеш - говнокод.

Попинайте меня чего я не так делаю, всем добра и плюсов в карму...
 

MiksIr

miksir@home:~$
И как быть с этой траблой?
crypt($pass . $salt_local, '$2a$07$' . $salt_rand . '$')
Но использование локальной соли (вернее, это не соль вообще, ну да ладно) несет в себе очень мало смысла, и обычно используется только новичками ;)
 

php55

Новичок
crypt($pass . $salt_local, '$2a$07$' . $salt_rand . '$')
Но использование локальной соли (вернее, это не соль вообще, ну да ладно) несет в себе очень мало смысла, и обычно используется только новичками ;)
Да ладно даже суть не в локальной соли, можно пережить и без нее, это так... Просто я чета неудобно себя чувствую с того что в результирующей строке находится сама соль... Хотя может мои заботы излишни...
 

MiksIr

miksir@home:~$
Соль не является сколько бы приватной информацией, у нее другие задачи, так что можете не волноваться ;) Главное, что бы на каждый пароль была своя уникальная соль.
 

AnrDaemon

Продвинутый новичок
Почему не воспользоваться функциями хэширования, предоставляемыми БД?
 

MiksIr

miksir@home:~$
Вот от тебя я такого вопроса не ожидал…
Вопрос был "что вы имеете ввиду". Насколько я знаю, в мускуле поддержка crypt только с убогим des, а в постгресе - только отдельно расширение ставить.
Вот я и спрашиваю - что? Ну и "нахрена" тоже, вощимта...
 

fixxxer

К.О.
Партнер клуба
в мускуле поддержка crypt только с убогим des
Не.
ENCRYPT(str[,salt])

Encrypts str using the Unix crypt() system call and returns a binary string. The salt argument must be a string with at least two characters or the result will be NULL. If no salt argument is given, a random value is used.
PHP:
mysql>  select encrypt('test', '$6$rounds=5000$usesomesillystringforsalt$');
+------------------------------------------------------------------------------------------------------------------------+
| encrypt('test', '$6$rounds=5000$usesomesillystringforsalt$')                                                           |
+------------------------------------------------------------------------------------------------------------------------+
| $6$rounds=5000$usesomesillystri$PuxMz1.CfLquO1z8clZhM3jl4LXOU3xoahnPaKHywIzObFcQQCXlmAhRAioS1UXQ06MecWfw.b.CesHUd0aTU/ |
+------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.04 sec)
Для постгреса - pgcrypto надо ставить, ога.
 

Фанат

oncle terrible
Команда форума
кажется, ты не понимаешь, что такое соль
Этот-то ладно. Мне как-то на хабре за 1 день слили карму, когда я пытался объяснить это орде тамошних хомячков.

Там вообще был очень смешной тред - очередная самозваная сикюрити консалтинг компани открыла миру свое ноу-хау. Поскольку БД они ломать более-менее умели, то вообразили, что если к лежащей в БД соли добавить еще лежащий за пределами БД кусок, то это сразу драматически повысит секурность хэшированных паролей.
 

fixxxer

К.О.
Партнер клуба
Не, ну из таких соображений можно вообще хеши не в базе хранить, а в фс, ну а чо :D
 

MiksIr

miksir@home:~$
Поскольку БД они ломать более-менее умели, то вообразили, что если к лежащей в БД соли добавить еще лежащий за пределами БД кусок, то это сразу драматически повысит секурность хэшированных паролей.
Оно в общем повысит даже... чуть-чуть, и если остальные принципы создания хеша соблюдены. Все же исключать случаев нельзя, что сливается база, а до когда не добрались. Но прибавляет гимора в разработке.
 

fixxxer

К.О.
Партнер клуба
Там системная либа, да.
Ну знаешь почему PHP сделала built-in либу, конечно? ;)) Переедедшь куда-нибудь, а там blowfish нет ;)
Вероятность того, что я перееду на windows, равна нулю целых нулю десятых :)
В линуксах, bsd, osx - все есть давно.
 

fixxxer

К.О.
Партнер клуба
Как-то это очень странно. У меня под рукой есть древний debian squeeze, там работает.

Код:
$ cat /etc/issue
Debian GNU/Linux 6.0 \n \l

$ php -r 'var_dump(crypt("test", "$2y$1234567890123456789012"));'
string(13) "$2rcByx51ejoM"


MariaDB [(none)]> select encrypt('test', '$2y$1234567890123456789012');
+-----------------------------------------------+
| encrypt('test', '$2y$1234567890123456789012') |
+-----------------------------------------------+
| $2rcByx51ejoM                                 |
+-----------------------------------------------+
EDITED:
я понял! используй $2a$, это везде работает. $2y$ это новый формат, он-то как раз очень не везде работает, даже на моей свеженькой макоси нету. Правда, этот 2а якобы дырявый, но это ж все очень потенциально, примерно как md5 :)
 
Последнее редактирование:

MiksIr

miksir@home:~$
$2rcByx51ejoM - это DES (соль первые два символа), и потом, я немного неверно соль написал, там вес обязателен (по крайней мере в PHP)
Код:
$ php -r 'var_dump(crypt("test", "$2y$06$234567890123456789012"));'
Но даже так - дебиан и 14.04 убунта дает NULL(хоть 2а, хоть 2у, хото просто 2), а Centos 6 и дебиан 7 - рассматривает как DES.
Интересно последний centos попробовать, но нету ;)
Но в общем тенденция понятна.
А blowfish_crypt считается интереснее, чем тот же sha, ибо требует больше памяти для рассчета, что мешает гонять на gpu.
 

MiksIr

miksir@home:~$
Я то задолбаюсь, а кто-то с gpu фермами - нет.

В этом bcrypt много лучше - так как он требует не только математики, но и таблицы в памяти, GPU/FPGA в лучшем случае упираются в шину работы с памятью и стопарятся, а в худшем - сильно повышаются затраты на работу, ибо нужно работать с памятью (кстати, именно по-этому сейчас активно предлагается использовать scrypt, там эта тема развивается)

Т.е. при равной ресурсоемкости - sha на специализированных фермах считается _проще_ (быстрее тут, наверное, не совсем верно)

Ну вот пример
На процессоре у меня
sha512crypt - 1158 h/s
bcrypt - 1435 h/s

На GPU
sha512crypt - 2063 h/s
bcrypt - 129 h/s

Понятно, что в зависимости от gpu все может быть иначе, но тенденция будет.
 
Сверху