Как сдампить хеши паролей от учеток Windows-системы

27.09.2018

В этом разделе разъясняются причины, стоящие за хэшированием паролей в целях безопасности, а также эффективные методы хэширования.

Почему я должен хэшировать пароли пользователей в моем приложении?

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

Техник не будет иметь те же привилегии в приложении, что и его иерархический начальник. В таком виде пароль является гарантом безопасности данных, поэтому необходимо защищать его усердно. Также существует часть этики в том, что даже лицо, ответственное за приложение, не должно знание идентификаторов пользователей. Если пароли зашифрованы, злоумышленнику будет гораздо труднее найти свою переписку в ясном виде, в этом примере атака происходит извне, так ли, если слабость системы находится в самой ее внутренней части?

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

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

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

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

Почему простых хешей больше не хватает?

Этот метод позволяет эффективно шифровать цепи, но оставаться «взломанными»! О, да? Да, действительно! Если исходный пароль - это слово из словаря, очень вероятно, что его можно найти в радужном столе из его хэша.

Хашеровские пароли с «солями»

Этот метод состоит в объединении одного или нескольких ключей к паролю, а затем хэш строки, созданной таким образом. Давайте рассмотрим простой пример хэша паролей из двух семян.

Почему популярные хэширующие функции, такие как md5() и sha1() не подходят для паролей?

Такие хэширующие алгоритмы как MD5, SHA1 и SHA256 были спроектированы очень быстрыми и эффективными. При наличии современных технологий и оборудования, стало довольно просто выяснить результат этих алгоритмов методом "грубой силы" для определения оригинальных вводимых данных.

Из-за той скорости, с которой современные компьютеры могут "обратить" эти хэширующие алгоритмы, многие профессионалы компьютерной безопасности строго не рекомендуют использовать их для хэширования паролей.

В чем смысл этой техники?

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

Можно ли использовать эту технику за пределами паролей

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

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

Если популярные хэширующие функции не подходят, как же я тогда должен хэшировать свои пароли?

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

PHP 5.5 предоставляет , которое безопасно работает и с хэшированием и с проверкой паролей . Также есть » PHP библиотека совместимости , доступная с PHP 5.3.7.

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

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

Другой возможностью является функция crypt() , которая поддерживает несколько алгоритмов хэширования в PHP 5.3 и новее. При использовании этой функции вы можете быть уверенным, что выбранный вами алгоритм доступен, так как PHP содержит собственную реализацию каждого поддерживаемого алгоритма, даже в случае, если какие-то из них не поддерживаются вашей системой.

Будет ли это потому, что это увеличивает риск столкновения? Это случилось со мной несколько раз. Мы не возвращаем оригинальный пароль, так как мы не можем его найти. В этом случае необходимо создать новый пароль и отправить его пользователю, чтобы он мог перенаправить и изменить его.

Поэтому шифрование не является англицизмом. Это историческое присвоение. Интересно, что для каждого пользователя необходимо использовать различную соль, это гарантирует еще большую безопасность. В любом случае, барышни здесь хорошо разработаны, браво!

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

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

Учтите, что, если вы используете функцию crypt() для проверки пароля, то вам нужно предостеречь себя от атак по времени, применяя сравнение строк, которое занимает постоянное время. Ни операторы PHP == и === , ни функция strcmp() не являются таковыми. Функция же password_verify() как раз делает то, что нужно. Настоятельно рекомендуется использовать встроенное API хэширования паролей , если есть такая возможность.

Редкое, чтобы подчеркнуть. Что произойдет, если вы найдете через радужные таблицы 2 соленых паролей? Мы быстро поймем, что во 2-м году тюрьмы и перерыва, и знаете, что пароль - это то, что он вводит, не так ли? Нет, все зависит от основного идентификатора, который должен быть поистине уникальным, оттуда нет столкновения.

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

Что такое соль?

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

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

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

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

password_hash() создает случайную соль в случае, если она не была передана, и чаще всего это наилучший и безопасный выбор.

Как я должен хранить свою соль?

При использовании функции password_hash() или crypt() , возвращаемое значение уже содержит соль как часть созданного хэша. Это значение нужно хранить как есть в вашей базе данных, так как оно содержит также информацию о хэширующей функции, которая использовалась, и может быть непосредственно передано в функции password_verify() или crypt() при проверке пароля.

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

Вот почему многие эксперты по безопасности считают, что эти алгоритмы являются слабыми и сильно отговаривают их от использования пароля пользователя. Когда пароли хэшируются, два наиболее важных соображения - это время обработки и зернистость соли. Чем выше требуемая мощность обработки, тем больше времени требуется, чтобы разбить пароль, проанализировав его выход.

Следующая диаграмма показывает формат возвращаемого значения функциями crypt() или password_hash() . Как можно видеть, они содержат полную информацию об алгоритме и соли, требуемых для будущей проверки пароля.

3 years ago

I feel like I should comment some of the clams being posted as replies here.

Используйте сильное случайное число для создания соли размером 16 байт или дольше. Увеличьте свою итерацию, чтобы не отставать от быстрых инструментов для взлома. Цель этой статьи - представить средства для реализации, чтобы очень сложно восстановить пароли для тех, кто читал вашу базу данных.

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

For starters, speed IS an issue with MD5 in particular and also SHA1. I"ve written my own MD5 bruteforce application just for the fun of it, and using only my CPU I can easily check a hash against about 200mill. hash per second. The main reason for this speed is that you for most attempts can bypass 19 out of 64 steps in the algorithm. For longer input (> 16 characters) it won"t apply, but I"m sure there"s some ways around it.

If you search online you"ll see people claiming to be able to check against billions of hashes per second using GPUs. I wouldn"t be surprised if it"s possible to reach 100 billion per second on a single computer alone these days, and it"s only going to get worse. It would require a watt monster with 4 dual high-end GPUs or something, but still possible.

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

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

Here"s why 100 billion per second is an issue:
Assume most passwords contain a selection of 96 characters. A password with 8 characters would then have 96^8 = 7,21389578984e+15 combinations.
With 100 billion per second it would then take 7,21389578984e+15 / 3600 = ~20 hours to figure out what it actually says. Keep in mind that you"ll need to add the numbers for 1-7 characters as well. 20 hours is not a lot if you want to target a single user.

So on essence:
There"s a reason why newer hash algorithms are specifically designed not to be easily implemented on GPUs.

Oh, and I can see there"s someone mentioning MD5 and rainbow tables. If you read the numbers here, I hope you realize how incredibly stupid and useless rainbow tables have become in terms of MD5. Unless the input to MD5 is really huge, you"re just not going to be able to compete with GPUs here. By the time a storage media is able to produce far beyond 3TB/s, the CPUs and GPUs will have reached much higher speeds.

Пределы хэш-функций

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

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

As for SHA1, my belief is that it"s about a third slower than MD5. I can"t verify this myself, but it seems to be the case judging the numbers presented for MD5 and SHA1. The issue with speeds is basically very much the same here as well.

The moral here:
Please do as told. Don"t every use MD5 and SHA1 for hasing passwords ever again. We all know passwords aren"t going to be that long for most people, and that"s a major disadvantage. Adding long salts will help for sure, but unless you want to add some hundred bytes of salt, there"s going to be fast bruteforce applications out there ready to reverse engineer your passwords or your users" passwords.

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

Сложность хэш-функции

Как мы видели, хеш-функции очень быстрые. Предположим, вы усложнили свою хеш-функцию, чтобы она работала в 10 мс, а не 500 нс. Простой способ увеличить сложность хэш-функции - это хеш-итеративно. Измените пароль, затем снова и снова отбивайте результат, пока не получите требуемую сложность.

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

Вот в чем моя проблема.

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

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

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

Есть несколько видов архитектуры систем (монолит, толстый клиент-сервер БД, тонкий клиент - сервер логики - сервер БД, веб-клиент - веб-сервер - сервер БД, веб-клиент - веб-сервер - сервер логики - сервер БД).

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

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

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

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

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

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

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

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

И вот, объясните мне, какая разница, в этот момент, что отправлять - открытые логин и пароль, хэш логина и пароля любой степени стойкости, хэш логина и пароля и любой комбинации данных, которые злоумышленник легко обнаруживает, исследуя алгоритм работы доступной ему клиентской части?

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

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

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

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

Похожие статьи