Basics in Cryptography: What is a password hash?

Что такое пароль?

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

Согласно техническому определению NIST, пароль - это “строка символов (букв, цифр и других знаков), которая используется для аутентификации личности, проверки разрешения на доступ или получения криптографических ключей”. Мы все прекрасно знаем, как вводить пароль для доступа к нашим любимым сайтам и учетным записям, но практика безопасного хранения этих учетных данных может быть немного сложнее.

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

К сожалению, вы не можете защитить себя на 100%, поскольку ваши учетные данные обрабатываются сервисами, на которые вы подписаны. Вот тут-то и происходит утечка данных. Мы уже давно знакомы с новостными статьями, в которых говорится что-то вроде “утечка включает в себя имена пользователей, даты рождения, адреса электронной почты, номера телефонов и хэши паролей”. Хотя большинство этих терминов легко понять, последний может стать источником путаницы. Чтобы прояснить ситуацию, давайте рассмотрим, как компании и онлайн-сервисы на самом деле обрабатывают данные, которые вы предоставляете при создании новой учетной записи.

Проблема безопасного хранения паролей.

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

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

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

В Tuta мы используем Argon2 для получения ключа, который открывает ваши зашифрованные данные (ключ-пароль). Когда мы перешли с bycrypt на argon2, мы также увеличили длину генерируемых ключей до 256 бит, что также делает их постквантовой безопасностью. Ключ пароля не используется для аутентификации на сервере Tuta, вместо этого мы хэшируем его с помощью SHA256, чтобы сделать пароль верификатором, который передается на сервер и снова хэшируется перед сохранением в базе данных. Подробнее о том, как обеспечивается защита пароля в Tuta, читайте здесь.

A visualization of how we handle passwords and encryption keys.

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

Что такое хеширование пароля?

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

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

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

Hashing functions are a one-way street

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

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

Что такое соленый хэш пароля?

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

An example of the difference between hashed passwords with and without salting.

Соление не только делает еду вкуснее, но и усиливает хэши паролей!

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

Проблемы и типы атак

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

Атаки на день рождения

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

Коллизионные атаки

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

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

Атаки грубой силы

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

Популярные хэш-функции

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

  1. MD5 : считаясь давно устаревшим алгоритмом, эта функция хэширования все еще регулярно встречается в новых наборах данных о взломах. MD5 был разработан профессором Массачусетского технологического института Рональдом Ривестом в 1991 году в качестве замены MD4. Она создает 128-битный хэш, но быстро показала, что подвержена атакам столкновений. В 2013 году исследователи смогли доказать, что алгоритм больше не является безопасным и должен быть заменен. К сожалению, хэши MD5 продолжают всплывать при утечке данных, а это значит, что ваши данные могут быть раскрыты не по вашей вине.
  2. SHA : Рекомендуемой заменой MD5 стало семейство функций хэширования Secure Hash Algorithms. SHA-1 был представлен в 1995 году после разработки АНБ и генерировал 160-битные хэши. В 2005 году алгоритм был признан небезопасным для продвинутых угроз, что представляло особую опасность для случаев, когда он использовался для создания цифровых подписей для проверки подлинности. SHA-2 был опубликован до этого в 2001 году и официально заменил своего предшественника в 2011 году, когда NIST ввел новые минимальные требования безопасности. К сожалению, их распространение было замедлено из-за отсутствия обратной совместимости. Совсем недавно, в 2015 году, был выпущен SHA-3 с совершенно иной структурой, чем предыдущие итерации, которые были похожи на MD5. SHA-2 и -3 поддерживают одинаковую длину хэша - от 256 до 512 бит в зависимости от выбранных настроек.
  3. bcrypt : Представленный в 1999 году, bcrypt - это алгоритм хеширования паролей, в котором по умолчанию реализовано высаливание, а также адаптивность. Это означает, что со временем он может продолжать противостоять атакам методом перебора. Bcrypt основан на шифре Blowfish, который был разработан Брюсом Шнайером.
  4. Argon2 : Argon2 стал победителем конкурса по хэшированию паролей 2015 года. Он не только устойчив к побочным каналам, но и не требует памяти, что делает его более устойчивым к атакам методом перебора, чем bcrypt.

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

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