1. PHP / Говнокод #13916

    +27

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    6. 6
    7. 7
    8. 8
    9. 9
    function makehash($str,$salt='',$strength='08'){
    	if (!$salt):
    		  $salt = "";
    		  for ($i = 0; $i < 22; $i++) {
    		    $salt .= substr("./ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789", mt_rand(0, 63), 1);
    		  }
    	endif;
        return crypt($str, "$2a$".$strength."$".$salt);
    }

    no comments

    Запостил: brainstorm, 09 Октября 2013

    Комментарии (58) RSS

    • Хз, человек хотел сгенерировать хеш в бкрипт формате. Зачем - тяжело сказать. Но вообще вся затея и ажиотаж вокруг нее вызваный бкриптом и ПХП выглядят придурочно потому что для того, чтобы проверить совпадение паролей нужно всю базу вывалить в ПХП и сравнивать пароли на стороне ПХП.
      Любой нормальный человек пошлет таких умников шифровать что-нибудь другое.
      Ответить
      • ну кагбэ тут делал жуткие потуги сменить пароль руками. набрел на это
        Ответить
      • Не всю, а только один, и то бкриптованый. И что в нем плохого по сравнению с несолеными одиночными хешами?
        Ответить
        • Ну и как узнать который?

          Смысл же использования пропадает. Как бы бкрипт может получив существующий хеш и пароль вернуть новый хеш, который, если совпадет с существующим хешем будет свидетельстовать о том, что исходный пароль был таким же. Но для этого нужно чтобы бкрипт выполнялся в условии запроса.
          Можно сделать по-другому, и хранить хеш, например, в базе, или в коде ПХП, но тогда весь смысл задумки теряется, и бкрипт превращается в обычный мдп5 примененный Х раз, или что-то типа того.
          Ответить
          • >Ну и как узнать который?
            Эээ по логину?

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

            >Можно сделать по-другому, и хранить хеш, например, в базе, или в коде ПХП, но тогда весь смысл задумки теряется, и бкрипт превращается в обычный мдп5 примененный Х раз, или что-то типа того.
            Ну в этом и есть смысл бкрипта :)
            Ответить
            • Нет, смылс бкрипта в том, чтобы соль у каждого пароля была своя. Она же поэтому и записывается в хеш. Но мы эту соль никак не получим, если у нас нету хеша, а хеш в базе...

              Т.е. хеш генерируемый бкриптом выглядит так:
              мэджик, сколько раз запускать алгоритм, соль, результат.
              Когда мы хотим узнать совпадает ли пароль, мы берем готовых хеш, вытаскиваем из него соль, хешируем новый пароль с той же солью, и если сошлость, то все круто. Но соль эту не имея хеша нам не получить. Или можно забить на эту уникальную возможность, и использовать соль одну на всех. Но тогда это скорее повышает уязвимость.
              Ответить
              • Я не понимаю, в чем проблема.

                1. SELECT hash FROM db WHERE username=%username%
                2. Вычленяем соль.
                3. Хешируем введенный пароль с солью из п.2.
                4. Сравниваем хеши.
                Ответить
                • Это то, о чем я в предыдущем посте говорил. %username% может вернуть много совпадений если не хочется людей желающих чтобы их звали koljan77 ограничивать в выборе юзернеймов.
                  Кроме того, это значит, что восстановление информации об учетке по паролю таки потребует выгрести все пароли из базы.
                  Ответить
                  • > восстановление информации об учетке по паролю
                    Можно хоть один сайт, который такое умеет? Обычно же наоборот, все сбрасывают пароль, зная что-то об учетке ;)

                    > если не хочется людей желающих чтобы их звали koljan77 ограничивать в выборе юзернеймов
                    А если они внезапно установят одинаковый пароль, то писать "извините, у другого Василия Пупкина уже используется такой пароль"? Нахуй, нахуй, такие наркоманские схемы... Имхо в таких случаях проще сделать уникальное поле login + неуникальное поле display name, чем заставлять юзера использовать только сгенеренные сервером пароли.
                    Ответить
                    • Однокласники.ру
                      Время от времени появляется какая-нибудь однокласница, которой срочно нужно показать свои фотографии, вот и приходится вспоминать то ник, то пароль...
                      Гмаил тоже так умеет. И ФБук тоже.

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

                      В Скайпе как правило с одним и тем же ником по 100500 человек.
                      Ответить
                      • >Гмаил тоже так умеет. И ФБук тоже.
                        Искать юзера по паролю?
                        Ответить
                      • > Гмаил тоже так умеет.
                        Ну вылогинился, нажал кнопочку "забыли свое имя пользователя?", предлагает ввести запасное мыло или фио, указанное при регистрации. Ткните носом, где можно узнать учетку по паролю...

                        P.S. Поиск учеток по паролю это не просто дыра в безопасности, это самое настоящее goatse. Вводим 123456 и другие простые пароли и имеем учетки ;) А если не дают выбрать конкретную учетку - то имеем отличный способ завалить кучу людей спамом от сервака ;)

                        > В Скайпе как правило с одним и тем же ником по 100500 человек.
                        Ну так display name != login.
                        Ответить
                        • >P.S. Поиск учеток по паролю это не просто дыра в безопасности, это самое настоящее goatse.
                          А то. Нормально спроектированная система просто не в состоянии найти двух пользователей с одним паролем.
                          Ответить
                          • Бред. Не большая дыра, чем поиск по имени пользователя. Ну вышлют пароль на другой почтовый ящик, который был с этого же аккаунта зарегистрирован, и что? Кому от этого хуже стало? Или взомав другой аккаунт человек не узнает об имени пользователя "забывшего пароль"?
                            Ответить
                            • Ты не понял. Искать по паролю можно, когда они или хранятся в плейнтексте, или хеш без соли, иначе тебе надо пробежаться по базе, выбрать все соли, прохешировать с каждой из них и сравнить с хешем (O(n юзеров)).
                              Ответить
                              • > Кроме того, это значит, что восстановление информации об учетке по паролю таки потребует выгрести все пароли из базы.
                                Ответить
                                • У тебя НЕ ДОЛЖНО быть паролей в плейнтексте. А считать медленный хеш для всех аккаунтов - долго.
                                  Ответить
                                  • > У тебя НЕ ДОЛЖНО быть паролей в плейнтексте.
                                    В идеале пароли в плейнтексте вообще должны быть только на стороне клиента во время их ввода ;)
                                    Ответить
                                  • А о чем говорит предыдущее предложение?
                                    Ответить
                                    • > А о чем говорит предыдущее предложение? Только о серверной стороне. А я упоминаю еще и о канале связи, в котором открытым паролям тоже не место.
                                      Ответить
                                      • @bormand вот когда SRP станет нормально поддерживаться, так и будет, а пока что сасать. Заодно и PKI станет ненужно.
                                        Ответить
                                        • > PKI станет ненужно
                                          Для взаимной аутентификации клиента и сервера - да. В общем случае - нет, всех задач PKI оно не решает.

                                          - Как с помощью SRP ты сможешь проверить, что сервер того же paypal это именно сервер paypal, а не китайская подделка, если ты на нем еще не зареган?
                                          - Как ты будешь использовать SRP для цифровой подписи?
                                          - Как сервер сможет проверить, что ты Вася Пупкин, а не просто некто, зерегистрировавшийя с верификатором b84a2f6fd141?
                                          Ответить
                                          • Решает проблемы парольной аутентификации, а остальное и сейчас проблем не вызывает.

                                            3. Вылезти из монитора и посмотреть на меня?
                                            Ответить
                                          • 1. Да, при реге проблема есть, но к утечке пароля она не ведет.
                                            2. А кому она нужна, по крайней мере, при аутентификации (какое слово хреновое) юзера?

                                            Кстати, кто-нибудь в курсе - почему его упорно не добавляют в реализации SSL? Есть какая-то полуебошная реализация в OpenSSL, которую я толком и не смог настроить.
                                            Ответить
                                            • > 1. Да, при реге проблема есть, но к утечке пароля она не ведет.
                                              Да причем тут утечка... Кому нахуй сдался мой пароль в духе xK#6nB9Rt, уникальный для каждого сайта? Проблема в том, что можно залететь и зарегаться на фейковом сервере и работать с ним даже не узнав об этом (и в результате просрать кредитку, персональные данные и т.п.). Эту проблему SRP не решает. Зато сейчас ее более-менее решает PKI.

                                              > А кому она нужна, по крайней мере, при аутентификации
                                              При аутентификации не нужна. Для заверения всяких доков и писем нужна. Если тебе что-то нинужно, это не означает, что это не нужно никому.

                                              > 3. Вылезти из монитора и посмотреть на меня?
                                              Сходишь в ближайший к тебе филиал какого-нибудь УЦ, получишь сертификат. И его будут принимать все серваки, которые доверяют данному УЦ.

                                              Так что не надо так категорично выпиливать PKI отовсюду ("Заодно и PKI станет ненужно"). Парольная аутентификация юзера это ж далеко не единственная задача криптографии...

                                              > Кстати, кто-нибудь в курсе - почему его упорно не добавляют в реализации SSL?
                                              Х.з. если честно. Вроде и бы не патентовано, и алгоритм простейший.
                                              Ответить
                                              • Хорошо, уговорил. PKI станет почти не нужно для парольной аутентификации (то, с чем типичный юзер имеет дело чаще всего) - а остальное и сейчас проблем особо не вызывает.

                                                У SRP есть еще один неприятный момент - он не работает с эллиптическими кривыми.
                                                Ответить
                                                • > У SRP есть еще один неприятный момент - он не работает с эллиптическими кривыми.
                                                  Да там вроде только возведения в степень, умножения да сложения... Все эти операции вполне выполнимы и над точками эллиптических кривых, так что, мне кажется, можно портануть.

                                                  Или есть статьи, в которых доказывается, что нельзя?
                                                  Ответить
                                                • > У SRP есть еще один неприятный момент - он не работает с эллиптическими кривыми.
                                                  Вот тебе ECSRP :)
                                                  http://grouper.ieee.org/groups/1363/passwdPK/submissions/p1363ecsrp.pdf
                                                  Ответить
                                                  • Вам криптографию что-ли нормально преподавали или сам выучил?

                                                    На кривые портируется DH, а в SRP есть сложение/вычитание по модулю простого числа.
                                                    ECSRP разве стал стандартом? На SSL-SRP есть RFC и то его не реализовывают, а это еще лет 100 мутить будут. http://crypto.stackexchange.com/questions/6519/can-srp-be-used-with-elliptic-curves (синего цвета нет, как бебекот панель добавить в прыщелисе или в userjs?)

                                                    https://groups.google.com/forum/#!msg/sci.crypt/DVSWBTKSVsg/nCGrwSnejuAJ тут какая-то дискуссия 97 года.
                                                    Ответить
                                                    • > Вам криптографию что-ли нормально преподавали или сам выучил?
                                                      Да нет не преподавали, сам учил... И судя по тому, что спутал поле с группой - выучил криво ;) Спасибо за ссылку.

                                                      > ECSRP разве стал стандартом?
                                                      Да на него я даже RFC не нашел.
                                                      Ответить
                                                      • >криптографию
                                                        >спутал поле с группой

                                                        и криктографию с алгемом
                                                        Ответить
                                                      • А я криптографию без дискретки учил и так и не знаю, что такое поле а что группа. У криптографических примитивов есть хорошие абстракции, позволяющие не залезать в дебри.
                                                        Ответить
                                                        • >А я криптографию без дискретки учил и так и не знаю, что такое поле а что группа

                                                          Мне физически больно это читать.
                                                          Ответить
                                                          • > Мне физически больно это читать.
                                                            Конечно, ведь там как минимум одной запятой нет.
                                                            Ответить
                                                          • >Мне физически больно это читать.
                                                            Юзать готовые алгоритмы и протоколы, понимая в общих чертах как это все работает мне это не мешает.
                                                            Ответить
                                                        • > что такое поле а что группа
                                                          А я когда-то знал, что из них что (в институте проходили), но уже забыл. Все что не юзаешь быстро забывается...
                                                          Ответить
                        • Да, если забыть как залогинится, то можно вспомнить только пароль, и потом еще ответить на пару наводящих вопросов, и учетку восстановят. Да, вот, Гитхаб тоже так же, если память не изменяет.

                          Про Гмаил знаю, потому что так восстанавливал.
                          Гмаил разный в разных странах, так что тут я не помощник. У нас теперь регистрация без номера телефона вообще не возможна (у меня раритетный акк, в котором телефон не требуют).
                          Ответить
                          • Оч интересно, ссылку?
                            Ответить
                            • http://goo.gl/1kGEPu
                              Ответить
                              • >Да, если забыть как залогинится, то можно вспомнить только пароль, и потом еще ответить на пару наводящих вопросов, и учетку восстановят.
                                Я про это.
                                Ответить
                                • Наздоровье:
                                  http://postimg.org/image/wyb68h7ct/
                                  http://postimg.org/image/5jbbv5uu9/
                                  Ответить
                                  • Пардон, но там спрашивают емейл. Ты мне покажи, где твою учетку находят на основании одного пароля.
                                    Ответить
                                    • И что? Спрашивают дополнительную почту, а не гуглопочту. Все как и было заявлено.
                                      Ответить
                        • > Ну так display name != login.

                          Именно, логин. Опять же, я скайпом пользуюсь раз в пару месяцев, и использование всегда начинается с восстановления пароля.
                          Ответить
                          • Ну вот открыл регистрацию скайпа. Вбил туда свой логин. Оно мне сказало, что такой логин использовать нельзя, и предложило дописать пару цифр. Что показывает, что людей с одинаковым логином там быть не может.
                            Ответить
                            • Хз. Ну может я что-то перепутал, т.как давно это было, но я практически уверен, что регистрировал несколько акков с одним именем.
                              Фейсбук - точно так можно, у меня есть несколько аккаунтов с одним именем, еще со времен когда чат для него делали.
                              Ответить
                              • Ну вот зарегались два человека с одним логином и паролем. Ситуация не такая уж маловероятная, однофамильцев полно, и люди часто юзают простые пароли.

                                Как теперь должен поступать сервер в момент входа одного из этих юзеров? ;)
                                Ответить
                                • А, я сейчас почитал, и понял почему в ФБуке так работает. Они вообще юзернейм для украшения используют, в авторизации он не принимает участия. Они наверное почту или еще что-то используют как уникальное имя.
                                  Ответить
                                  • Вот-вот... о чем я и писал выше, говоря об уникальном поле login (в качестве которого иногда выступает мыло или сотик) и о неуникальном поле display name (ник, фио и т.п.)...
                                    Ответить
                  • Для логина нужен какой-то уникальный id, вот по нему и ищешь.

                    >Кроме того, это значит, что восстановление информации об учетке по паролю
                    Вы не можете выбрать этот пароль, т.к. его уже выбрал пользователь vasya127. Выберите другой.
                    Ответить
        • А, ну, хотя да, погарячился. Можно сначала например, по имени выбрать, а потом всех однофамильцев проверить. Проблему это не отменяет, но делает ее приемлимой.
          Ответить
    • не переведутся на Руси программисты, которые считают, что их велосипедный алгоритм сжатия\шифрования\хэширования будет пуленепробиваемо криптостойкий в силу недоступности исходников
      Ответить

    Добавить комментарий