Что лучше подойдет для хранения данных шифрование или хеширование

Обновлено: 07.07.2024

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

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

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

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

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

В общем виде функцию с использованием соли можно представить так:

f(password, salt) = hash(password + salt)

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

if (hash([введённый пароль] + [соль]) == [хэш]) тогда пользователь аутентифицирован

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

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

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

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

Когда от компьютера хотят случайное число, то обычно он берёт данные из нескольких источников (например, переменные среды: дату, время, количество записанных/считанных байтов и т. д.), а затем производит над ними вычисления для получения «случайных» данных. Поэтому такие данные называют псевдослучайными. А значит, если каким-то образом воссоздать набор исходных состояний на момент исполнения псевдослучайной функции, то мы сможем сгенерировать то же самое число.

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

image

А теперь сравните с данными, сгенерированными полноценным генератором случайных чисел:


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

Если вам нужно получить случайные данные, воспользуйтесь функцией openssl_random_pseudo_bytes(), которая доступна начиная с версии 5.3.0. У неё даже есть флаг crypto_strong, который сообщит о достаточном уровне безопасности.

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


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

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

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

Есть и более затратные по времени и памяти алгоритмы, например bcrypt (о нём мы поговорим ниже) или scrypt:

  • $cost — коэффициент трудоёмкости;
  • $salt — случайная строка. Её можно генерировать, например, с помощью описанной выше функции secure_rand().

На данный момент в PHP не реализована поддержка алгоритма scrypt, но можно воспользоваться реализацией от Domblack.

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

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

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

image

Предположим, что в таблице хранятся следующие данные в виде обычного текста:


  1. использовал один и тот же криптоключ;
  2. оставил поля passwordHint незашифрованными.

image

Мы не знаем, какой применялся криптоключ. Но если проанализировать данные, то можно заметить, что в строках 2 и 7 используется один и тот же пароль, так же как и в строках 3 и 6.

Пришло время обратиться к подсказке пароля. В строке 6 это «I’m one!», что совершенно неинформативно. Зато благодаря строке 3 мы можем предположить, что пароль — queen. Строки 2 и 7 по отдельности не позволяют вычислить пароль, но если проанализировать их вместе, то можно предположить, что это halloween.

Ради снижения риска утечки данных лучше использовать разные способы хэширования. А если вам нужно шифровать пароли, то обратите внимание на настраиваемое шифрование:

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

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

f(key, primaryKey) = key + primaryKey

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

Если мы применим к нашей таблице настраиваемое шифрование, то она будет выглядеть так:

image

Конечно, нужно будет ещё что-то сделать с подсказками паролей, но всё-таки уже получилось хоть что-то адекватное.

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

Сегодня оптимальным способом хэширования паролей считается использование bcrypt. Но многие разработчики всё ещё предпочитают старые и более слабые алгоритмы вроде MD5 и SHA-1. А некоторые при хэшировании даже не пользуются солью. В PHP 5.5 был представлен новый API для хэширования, который не только поощряет применение bcrypt, но и существенно облегчает работу с ним. Давайте разберём основы использования этого нового API.

  • password_hash() — хэширование пароля;
  • password_verify() — сравнение пароля с хэшем;
  • password_needs_rehash() — перехэширование пароля;
  • password_get_info() — возвращение названия алгоритма хэширования и применявшихся в ходе хэширования опций.

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

Функция password_hash() существенно облегчает разработчику жизнь и повышает безопасность кода. Для хэширования пароля достаточно скормить его функции, и она вернёт хэш, который можно поместить в БД:

И всё! Первый аргумент — пароль в виде строки, второй аргумент задаёт алгоритм генерирования хэша. По умолчанию используется bcrypt, но при необходимости можно добавить и более сильный алгоритм, который позволит генерировать строки большей длины. Если в своём проекте вы используете PASSWORD_DEFAULT, то удостоверьтесь, что ширина колонки для хранения хэшей не менее 60 символов. Лучше сразу задать 255 знаков. В качестве второго аргумента можно использовать PASSWORD_BCRYPT. В этом случае хэш всегда будет длиной в 60 символов.

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

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

Теперь рассмотрим функцию сравнения пароля с хэшем. Первый вводится пользователем, а второй мы берём из БД. Пароль и хэш используются в качестве двух аргументов функции password_verify(). Если хэш соответствует паролю, то функция возвращает true.

Помните, что соль является частью хэша, поэтому она не задаётся здесь отдельно.

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

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

  • algo — константа, позволяющая идентифицировать алгоритм;
  • algoName — название использовавшегося алгоритма;
  • options — значения разных опций, применявшихся при хэшировании.

Как видите, работать с новым API не в пример легче, чем с неуклюжей функцией crypt(). Если же вы используете более ранние версии PHP, то рекомендую обратить внимание на библиотеку password_compact. Она эмулирует данный API и автоматически отключается, когда вы обновляетесь до версии 5.5.


Статьи

Картинки по запросу md5 hash

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

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

Получающаяся строчка или число фиксированной длины будут значительно различаться в зависимости от незначительных изменений на входе.

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

Популярные алгоритмы

Этот алгоритм производит 16-битное значение хэша, обычно выражаемую 32 значным шестнадцатеричным числом.

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

SHA-0 очень редко используется, поскольку он имел уязвимость, которая была исправлена в SHA-1.

SHA-2 состоит из ряда 6 алгоритмов хеширования и считается самым сильным.

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

Когда должно использоваться хэширование?

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

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

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

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

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

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

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

Именно так, пожалуй, и думает большинство людей, когда они слышат о шифровании.

У шифрования на основе открытй ключей для сравнения есть два различных ключа, один шифрует последовательность (открытый ключ) и один расшифровывает ее (закрытый ключ).

Популярные алгоритмы

Когда должно использоваться шифрование?

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

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

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

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

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

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

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

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

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

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

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

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

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

FeiUVFnIpb9d0cbXP / Ybrw ==

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

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

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

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

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

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

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

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

  • 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 решает некоторые из его проблем безопасности и может быть лучшим вариантом во многих ситуациях..

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

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

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

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

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

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

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

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

Хеширование

Термин происходит от английского слова hash – «фарш», «месиво». Примерно так хеш-функция и работает: массив данных (например, фрагмент текста) преобразуется в уникальную строку (хеш-сумму), по которой невозможно восстановить исходную информацию.

Хеширование

Хеширование одного параграфа этой статьи

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

Хеширование - 2

В базе данных уже есть хеш пароля password123

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

Если во всей «Большой советской энциклопедии» изменить всего лишь одну букву, хеш-сумма уже будет другой. То же самое произойдет при изменении всего одного байта в любом файле – программе, видео, документе.

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

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

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

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


Контрольные суммы на странице загрузки программы

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

Шифрование

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

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

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

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

Кодирование

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

В беспроводных сетях закодированная информация передается методом модуляции высокочастотных сигналов. Это известные любому пользователю Bluetooth и Wi-Fi.

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

  • ASCII-совместимые;
  • UTF-8;
  • EBCDIC-совместимые.

Обычному пользователю эти термины ни о чем не говорят, пока он не получит по электронной почте нечитаемую абракадабру. Или не попытается открыть кириллический readme-файл на компьютере с англоязычной версией операционной системы Windows.

Кодирование

Нечитаемый текст в кириллической кодировке

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

Кодирование - 2

Сервис автоматически определил кодировку и привел текст в нормальный вид

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

Кодировка первой веб-страницы правильная

Еще одно повседневное проявление кодирования информации – различные кодеки видео и аудио: mp3, flac, xvid, hevc. Их назначение, помимо непосредственной передачи информации – сжатие до приемлемого соотношения качества и объема.

Пример совместной работы

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

  1. Видео и аудио-дорожка были обработаны кодеками для уменьшения размера – это кодирование. В процессах скачивания и просмотра происходят операции кодирования /раскодирования.
  2. Файлы были сохранены в архиве с паролем – симметричное шифрование.
  3. Сериал был найден торрент-клиентом по хеш-тегу, по окончании скачивания программа проверила целостность файла – хеширование.

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

Главные различия между шифрованием, хешированием и кодированием

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

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

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

Дайте знать, что вы думаете по этой теме в комментариях. За комментарии, подписки, дизлайки, отклики, лайки низкий вам поклон!

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

Читайте также: