Что такое соль в хешировании

от admin

Как создать надежный пароль, а также об использовании хеш функции

Для использования практически любого ресурса в сети интернет необходим пароль: электронная почта, социальные сети или интернет-банк. В этой статье рассмотрим: как создать надежный пароль? За какое время злоумышленник может подобрать необходимую комбинацию цифр и букв для входа в вашу учетную запись? Расскажем про хеш-функции, а также добавим немного «соли» в наши пароли.

Для начала разберемся с базовыми понятиями.

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

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

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

Рассмотрим таблицу с количеством возможных вариантов паролей при разных условиях

Чтобы понять, как это работает. Давайте решим задачу.

Злоумышленник может угадывать 1000 паролей в секунду. Сотрудник подразделения меняет пароль раз в 90 дней. Какой минимальной длины должен быть пароль (содержащий верхний/нижний регистр, спецсимволы и цифры), чтобы злоумышленник его не взломал?

Считаем: сколько может угадать паролей злоумышленник за 90 дней.

90 (дни) * 24 (часы) * 60 (минуты) * 60 (секунды) * 1000 (кол-во паролей в секунду) = 7 776 000 000 до истечения срока действия пароля. Из нашей таблицы видно, если использовать все возможные условия, то пароля из 6 символов будет достаточно, до того момента как злоумышленник взломает пароль.

Так каким же должен быть пароль? (Немного о создании)

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

Что такое хешированные пароли? Рассмотрим подробнее.

Сами хешированные пароли не являются уникальными, когда задается одно и то же входное значение, всегда получится одинаковое выходное значение. Если Рома и Наташа выберут NewTechAudit2020 в качестве пароля, то и их хеш будет одинаковым:

Задача на подумать, сложные ли у ребят пароли?

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

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

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

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

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

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

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

Допустим, у нас есть пароль NewTechAudit2020 и соль l0veaaaud1t. Мы можем использовать соль одним из следующих образов: добавлением соли справа — NewTechAudit2020l0veaaaud1t или добавлением соли слева — l0veaaaud1tNewTechAudit2020. Как только соль будет добавлена, мы сможем затем захешировать ее. Давайте посмотрим на это на примере с использованием следующего кода Python:

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

Наташа и Рома используют один и тот же пароль NewTechAudit2020. Для Наташи мы будем использовать соль h1m3gaw0rld, а для Ромы мы будем использовать d0kak1nggg в качестве соли.

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

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

Итак, каким же идеальный пароль должен быть?

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

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

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

Но как вы аутентифицировать себя? Просто обойдя имя пользователя и пароль, вы можете войти в свою учетную запись и получить доступ к данным, верно? Теперь возникает вопрос: насколько безопасны ваши данные?

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

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

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

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

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

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

Что такое соление?

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

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

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

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

Что такое bcrypt?

bcrypt — это библиотека узлов, хэширующая пароли. Вы можете прочитать о bcrypt в Википедии.

Вам необходимо установить эту библиотеку через NPM. Используйте следующую команду для установки bcrypt.

В следующем примере показан код для хеширования строкового значения с помощью bcrypt.

На консоли вы получите следующий вывод.

Если мы наблюдаем вывод пароля на рис. 2, мы получаем три символа $, которые делят все хеш-значение на 3 группы. Давайте разбираться по порядку.

  1. 2 миллиарда долларов определяет версию алгоритма bcrypt.
  2. 10 долларов 10 — это коэффициент стоимости (раунды соли), который мы передаем в приведенном выше примере кода, то есть bcrypt.genSalt (10) ;. если мы добавим 15 внутри скобок, то получится 15-й раунд соли для генерации случайных данных соли.
  3. Третья часть — это первые 22 символа после $, представляющие собой строку соли.

Остальные символы — это хешированный пароль.

Итак, наконец, мы получили HashedPassword, который защищает наши данные от хакеров. Даже если злоумышленник взломает пароль, он не сможет взломать данные и войти в систему как жертва.

Заключение

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

Надлежащее хэширование паролей

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

1 Введение

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

1.1 Текущее положение

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

1.2 Моральное обязательство

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

2 Надлежащие методы хэширования

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

2.1 Соль хороша для вас

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

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

2.2 Функции получения ключей

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

2.2.1 PBKDF2

PBKDF2 (Password-Based Key Derivation Function 2 или Функция Получения Ключа На Основе Пароля 2) – это функция получения ключа, разработанная RSA Laboratories, используемая для получения стойких ключей на основе хэша. Она работает путем применения псевдослучайной хэш-функции (вроде SHA-256, SHA-512, и т. д.) к строке, в нашем случае – к паролю, вместе с солью и повторением этого процесса большое число раз. Данный процесс может быть обобщен следующей диаграммой:

Мы уже обсудили вопрос соли, однако, стоит отметить, что минимальная длина рекомендуемой соли для PBKDF – 128 бит. Спецификация 1 PBKDF утверждает, что SHA-1 2 является утвержденной PRF (псевдослучайной функцией) для алгоритма. Однако, в 2005 году стало ясно, что SHA-1 – относительно слабая функция 3 и не должна использоваться как HMAC. В ваших интересах использовать достаточно сильный HMAC, чтобы выдержать полный перебор, специальные атаки и потенциальные будущие проблемы дизайна (вроде взлома алгоритма или вычислительной достижимости). Важно отметить разницу между хэшем и HMAC – хэш не связан с аутентификацией сообщения. Он связан только с целостностью данных. HMAC обычно используется для подписи сообщений при хэшировании их с солью, уникальной для ее владельца. HMAC также можно использовать для генерации очень сильных хэшей. Проблема в том, что при известной соли HMAC столь же легко взломать полным перебором. Здесь на выручку приходит PBKDF2, реализующая итеративный HMAC, который увеличивает безопасность и время взлома каждого отдельного хэша. Давайте взглянем на псевдокод этого процесса:

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

Хоть вышеприведенные примеры и обобщены, они дают базовый взгляд на то, как может быть реализована функция PBKDF2. Здесь всего лишь хэшируется соль и открытый текст для получения первого хэша, затем в цикле тот же алгоритм используется для вычисления хэша от открытого текста и результата предыдущей итерации, после чего возвращается результат применения операции XOR ко всем вычисленным хэшам. Выполнив данную операцию 1000 или больше раз, вы сгенерируете сильный, стойкий ко взлому хэш, который вы можете безопасно использовать для хранения паролей. За подробностями можете обратиться к NIST-SP800-132.

2.2.2 ARC4PBKDF2

Я (bwall) некоторое время обыгрывал в уме идею динамической энтропии. PBKDF2 кажется хорошей площадкой для ее внедрения. Данная идея заключается в том, чтобы сделать энтропию алгоритма шифрования изменяющейся в ходе шифрования. Она происходит из ограничений некоторых систем быстрого взлома хэшей, которые имеют тенденцию жестко оптимизировать определенные процессы вроде применения энтропии. Чтобы бороться с этим, мы можем добавить относительно быстрый процесс создания дополнительной энтропии, который потребует дополнительных вычислений в ходе взлома хэша и возможного удаления некоторых оптимизаций. В ARC4PBKDF2 поток шифра ARC4 инициализируется ключом, затем данный шифр используется для шифрования открытого текста перед его использованием в HMAC в каждой итерации, продолжая тот же поток и также шифруя результат HMAC. Этот поток ARC4 должен быть единым для всего процесса, чтобы добавить сложности и в без того трудный для взлома метод хэширования. Далее представлен пример реализации на C#.

public byte[] Hash(byte[] input) < ARC4 rc4 = new ARC4(ARC4Key);
byte[] derived = new HMACSHA256(Salt).ComputeHash(rc4.CryptBytes(input));
byte[] temp = derived; for (int x = 0; x < Iterations; x++) < temp = rc4.CryptBytes(new
HMACSHA256(temp).ComputeHash(rc4.CryptBytes(input)));
for (int y = 0; y < derived.Length; y++) < derived[y] ^= temp[y]; >> return derived; >

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

2.2.3 bcrypt

Bcrypt – адаптивная хэш-функция, появившаяся в 1999 году. Она немного походит на PBKDF2, но действует более сложным образом. Первую работу, связанную с данной функцией, опубликованную Наелсом Провосом и Дэвидом Мазьересом, можно найти здесь. Она очень подробно объясняет тонкости алгоритма и его реализацию. Для наших целей будет достаточно краткого обзора с примером.

По сути, bcrypt – это блочный шифр Blowfish 4 , используемый в режиме ECB, с более сложным алгоримом подготовки ключей (особенно, что касается S-блоков). Это позволяет алгоритму быть стойким к возможным будущим атакам и существенно более адаптивным. Реализация алгоритма использует 128-битную соль и усовершенствованный алгоритм, известный, как eksblowfish или expensive key schedule blowfish. Заголовок функции bcrypt выглядит так:

bcrypt(cost, salt, pwd)

Здесь cost – контроллер подготовки ключей (задает ресурсоемкость фазы подготовки ключей), salt – 128-битное значение, а pwd – текстовый (до 56 байтов) ключ, используемый для шифрования по алгоритму Blowfish.

Существует пара действительно удивительных, полезных вещей, касающихся bcrypt и заслуживающих обсуждения. Одна из них – то, что алгоритму НЕОБХОДИМА соль. Хотя соль сама по себе не сохранит ваш украденный SQL-дамп, она увеличит его стойкость. Вторая – то, что алгоритм является (я использовал этот термин уже несколько раз) адаптивным. Время подготовки ключей может быть всего порядка одной миллисекунды или таким большим, как вы захотите. Замечательный факт состоит в том, что для сервера почти безразлично, что проверка пароля занимает 3 секунды вместо 0.3, но для атакующего такое увеличение сложности – абсолютный хаос. Это также позволяет напрямую бороться с экспоненциальным наращиванием вычислительных мощностей (известным, как закон Мура), поскольку со временем вы можете постепенно изменять значение переменной cost, чтобы увеличить сложность паролей.

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

public string bcrypt(int cost, byte[] salt, byte[] password)
< byte[] state = EksBlowFishSetup(cost, salt, password);
string ciphertext = "OrpheanBeholderScryDoubt"; for (int i = 0; i < 64; ++i)
< ciphertext = EncryptECB(state, ciphertext); >
return cost.ToString() + BitConverter.ToString(salt) + ciphertext; >

Вышеприведенный код довольно прост. Сначала значение переменной state устанавливается алгоритмом EksBlowFish – данная стадия является наиболее емкой по времени. Далее идет цикл получения шифртекста, изначально имеющего значение 192-битной магической строки (почти всегда равной "OrpheanBeholderScryDoubt"), путем многократного шифрования шифртекста из предыдущей итерации в режиме ECB вместе со значением переменной state. Итоговый результат – статическая 192-битная конкатенация стоимости, соли и результирующего шифртекста.

3 Заключение

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

Читать:
Как сделать много копий одного файла

Шифрование, хеширование, соление – какая разница?

Шифрование, хеширование, засолка - какая разница

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

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

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

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

Что такое шифрование?

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

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

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

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

Смотрите также: Общие типы шифрования объяснены

Общие алгоритмы шифрования

  • Цезарь Шифр ​​- Это простой код, который включает в себя смещение каждой буквы на фиксированное число мест. Если шифр Цезаря имеет сдвиг три, каждое «а» станет «d», каждый «b» станет «e», каждый «c» станет «f» и так далее. Он назван в честь Юлия Цезаря, который был первым, кто записал использовать схему.
  • AES — Расширенный стандарт шифрования — это сложный алгоритм с симметричным ключом, который обеспечивает значительную часть наших современных коммуникаций. Он включает в себя ряд сложных шагов и часто используется для шифрования данных в TLS, приложениях обмена сообщениями, в покое и во многих других ситуациях. Мы углубимся в шифрование AES здесь.
  • 3DES — Тройной DES основан на алгоритме DES. Когда растущая мощность компьютера делала DES небезопасным, 3DES разрабатывался как усиленный алгоритм. В 3DES данные запускаются по алгоритму DES три раза, а не один раз, что усложняет взлом. 3DES может использоваться для многих из тех же вещей, что и AES, но только определенные реализации считаются безопасными.
  • RSA — Шифр ​​Ривеста-Шамира-Адлемана был первой формой широко используемой криптографии с открытым ключом. Это позволяет организациям безопасно общаться, даже если они не встречались или имели возможность обмениваться ключами. Он может использоваться в ряде различных протоколов безопасности, таких как PGP и TLS. У нас есть подробное руководство по шифрованию RSA здесь.
  • ECDSA — Алгоритм цифровой подписи эллиптической кривой — это вариант DSA, в котором используется криптография с эллиптической кривой. Как алгоритм с открытым ключом, он может применяться в аналогичных ситуациях с RSA, хотя он реже применяется из-за некоторых проблем безопасности.

Шифрование в действии

Чтобы дать вам представление о том, как работает шифрование на практике, мы будем использовать в качестве примера шифр Цезаря. Если мы хотим зашифровать сообщение «Давайте естьСо сдвигом три,LСтал быО«еСтал бычас» и так далее. Это дает нам зашифрованное сообщение:

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

Одним из примеров является AES. Если мы используем 128-битный онлайн-калькулятор AES для шифрования:Давайте естьС ключом «1234», Это дает нам:

FeiUVFnIpb9d0cbXP / Ybrw ==

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

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

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

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

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

Для чего используются хэши?

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

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

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

Общие криптографические хеш-функции

  • MD5 — Это хеш-функция, впервые опубликованная в 1991 году Роном Ривестом. В настоящее время он считается небезопасным и не должен использоваться в криптографических целях. Несмотря на это, он все еще может быть использован для проверки целостности данных.
  • SHA-1 — Безопасный алгоритм хеширования 1 используется с 1995 года, но не считается безопасным с 2005 года, когда имел место ряд успешных атак на столкновения. Теперь рекомендуется использовать либо SHA-2, либо SHA-3..
  • SHA-2 — Это семейство хеш-функций, которые являются преемниками SHA-1. Эти функции содержат многочисленные улучшения, которые делают их безопасными в самых разных приложениях. Несмотря на это, SHA-256 и SHA-512 уязвимы для атак с удлинением длины, поэтому в определенных ситуациях лучше всего реализовать SHA-3..
  • SHA-3 — SHA-3 — самый новый член семейства Secure Hash Algorithm, но он построен совсем не так, как его предшественники. На данном этапе он еще не заменил SHA-2, а просто предоставляет криптографам еще один вариант, который может обеспечить повышенную безопасность в определенных ситуациях..
  • RIPEMD — RIPEMD — это еще одно семейство функций, разработанное академическим сообществом. Он основан на многих идеях MD4 (предшественника MD5) и не ограничен никакими патентами. RIPEMD-160 все еще считается относительно безопасным, но он не получил широкого распространения.
  • джакузи — Whirlpool — это хеш-функция из семейства квадратных блоков. Он основан на модификации AES и не подпадает под действие каких-либо патентов. Он считается безопасным, но несколько медленнее, чем некоторые из его альтернатив, что привело к ограниченному принятию.

Хеширование в действии

Теперь, когда вы понимаете, что такое хэш-функции, пришло время применить их на практике. Если мы поместим тот же текст «Давайте есть”В онлайн-калькулятор SHA-256, он дает нам:

5c79ab8b36c4c0f8566cee2c8e47135f2536d4f715a22c99fa099a04edbbb6f2

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

4be9316a71efc7c152f4856261efb3836d09f611726783bd1fef085bc81b1342

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

Хеш-функции и пароли

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

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

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

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

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

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

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

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

Что такое соление?

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

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

Слабые пароли

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

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

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

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

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

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

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

Как засолка работает на практике

Например, предположим, у вас есть учетная запись электронной почты и ваш пароль «1234». Когда мы используем онлайн-калькулятор SHA-256, в качестве значения хеш-функции мы получаем следующее:

03ac674216f3e15c761ee1a5e255f067953623c8b388b4459e13f978d7c846f4

Этот хэш будет храниться в базе данных для вашей учетной записи. Когда вы вводите свой пароль «1234”, Он хэшируется, а затем значение сравнивается с сохраненным значением. Поскольку эти два значения одинаковы, вам будет предоставлен доступ.

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

Хеш-таблица скажет им, что:

03ac674216f3e15c761ee1a5e255f067953623c8b388b4459e13f978d7c846f4

Злоумышленник узнает, что ваш пароль «1234». Затем они могут использовать этот пароль для входа в свою учетную запись.

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

Давайте возьмем 16-символьную соль случайных данных:

H82BV63KG9SBD93B

Мы добавляем его к нашему простому паролю «1234» вот так:

1234H82BV63KG9SBD93B

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

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

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

Взломать целые базы данных

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

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

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

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

Потенциальные недостатки соли

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

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

Общие алгоритмы посола

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

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

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

Произносится «склеп”, Это второй самый молодой алгоритм хеширования паролей, который широко используется. Разработанный в 2009 году, Scrypt использует большой, но регулируемый объем памяти в своих вычислениях. Его регулируемая природа означает, что он все еще может быть устойчивым к атакам, даже если вычислительная мощность растет со временем.

bcrypt был разработан в 1999 году и основан на шифре Blowfish. Это был один из наиболее часто используемых алгоритмов, используемых в хешировании паролей в течение многих лет, но теперь он более уязвим к программируемым полевым массивам шлюзов (FPGA). Вот почему Argon2 часто предпочтительнее в новых реализациях.

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

Шифрование, перемешивание и посол: резюме

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

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

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

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

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

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

Related Posts