Что такое хеширование, шифрование и кодировка

Алгоритмы хеширования и примеры

Каркас .NET (System.Security.Cryptography) включает в себя встроенную поддержку нескольких криптографических хеш-функций:

•    MD5 – взломан, старайтесь избегать.•    RIPEMD160 – приемлем, вообще не популярен в США.•    SHA1 – приемлем, но 160 битные выходные данные считаются слишком короткими.•    SHA256 – рекомендуемый минимум.•    SHA384 (SHA2) — рекомендуется.•    SHA512 – очень надежен, но не обеспечивает дополнительной защиты в сравнении с SHA384.

Пример – хеширование строки:

public byte[] EncryptPassword(string userName, string password,        int encryptionVersion, byte[] salt1, byte[] salt2){    string tmpPassword = null;    switch(encryptionVersion)    {        case 2: // пароль + много соли            tmpPassword = Convert.ToBase64String(salt1)             + Convert.ToBase64String(salt2)             + userName.ToLower() + password;            break;        case 1: // логин в качестве соли            tmpPassword  = userName.ToLower() + password;            break;        case 0: // без соли        default:            tmpPassword = password;            break;    }    //Строка пароля преобразуется в массив байтов.    UTF8Encoding textConverter = new UTF8Encoding();    byte[] passBytes = textConverter.GetBytes(tmpPassword);    //Возвращаются зашифрованные байты    if (encryptionVersion == 2)        return new SHA384Managed().ComputeHash(passBytes);    else        return new MD5CryptoServiceProvider().ComputeHash(passBytes);}

Пример – сравнение двух хешей на равенство:

// Сравниваются два массива на равенство// Можно добавить сравнение длины, но обычно// размер всех хешей одинаков.private bool PasswordsMatch(byte[] psswd1, byte[] psswd2){    try    {        for(int i = 0; i < psswd1.Length; i++)        {            if(psswd1 != psswd2)                return false;        }        return true;    }    catch(IndexOutOfRangeException)    {        return false;    }}

Хеширование данных

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

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

Известными алгоритмами хеширования являются MD5, SHA-1 и SHA-2.

Основные принципы хеширования

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

Одним из самых простых применений хеширования является хранение паролей (считается более защищённым способом, чем хранение паролей в явном виде).

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

Сломанная кодировка

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

Похожая ситуация в компьютере. Допустим, вы увидели такой текст: 

рТЙЧЕФ, ЬФП ЦХТОБМ лПД!

Здесь написано «Привет, это журнал Код!», только в кодировке КОИ-8, которую интерпретировали через кодировку CP-1251. Компьютер не знал, какая здесь должна быть кодировка, поэтому взял стандартную для него CP-1251, посмотрел символы по таблице и выдал то, что получилось. Если бы компьютер знал, что для этой кодировки нужна другая таблица, мы бы всё прочитали правильно с первого раза.

Итерации (раунды) хеширования

Итак, для преобразования пароля в ключ шифрования, как правило, используется хеширование, а число алгоритмов хеширования фактически ограничено «большой тройкой» — SHA-1, SHA-256 и SHA-512. В то же время скорость работы атак методом полного перебора может отличаться на многие порядки в зависимости от того, какой именно набор данных подвергается атаке. Почему так происходит?

Разумеется, нельзя сбрасывать со счетов разницу в алгоритмах хеширования. Так, преобразование SHA-1 работает быстрее, чем SHA-512, которое, в свою очередь, быстрее, чем SHA-256. Самым медленным из популярных алгоритмов является Whirlpool. В зависимости от того, какой именно алгоритм хеширования используют разработчики конкретного приложения или формата данных, атака может происходить с большей или меньшей скоростью.

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

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

В современных приложениях используются сотни тысяч и даже миллионы итераций хеш-функции. Так, документы Microsoft Office используют 100,000 итераций, что позволяет проверить порядка десятка паролей в секунду. После фиаско с iOS 10.0 разработчики Apple увеличили число раундов хеширования до миллиона (!), в результате чего скорость проверки паролей к резервным копиям iTunes составляет единицы паролей в минуту. Криптоконтейнеры VeraCrypt защищены 500,000 раундами хеширования, причём у пользователя есть возможность изменить это значение в большую сторону.

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

Практическое применение

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

  1. Протокол для аудита целостности информации. В процессе передачи документов осуществляется вычисления хэш-кода. Результат передается вместе с документами. Прием информации сопровождается повторным вычислением хэш-кода с последующим сравнением, полученным значением. Несовпадение – ошибка. Этот алгоритм обладает высокими скоростными показателями при вычислении, но отличается нестабильностью и малым значением хэш-функции. Пример – протокол CRC-32, который имеет только 232 значения хэш, различающихся между собой.
  2. Криптографический алгоритм. Внедряется в качестве защиты от несанкционированного доступа (взлома). Проверяет систему на предмет искажения информации в момент передачи файлов по сети. При таких обстоятельствах «правильный» хэш имеет свободный доступ, а ключ, полученного документа, вычисляется при помощи разнообразных софтов (программ). Пример – SHA-1, SHA-2, MD5, отличающихся стабильностью и сложнейшим уравнением поиска коллизий.
  3. Протокол для создания эффективной информационной конструкции. Определяющая задача – структурирование информации в хэш-таблицы. Такая табличная структура делает возможным добавлять/удалять, находить нужные данные с невероятной скоростью.

Разберемся детальней в сфере применения протоколов хеширования.

Скачивание файлов из Всемирной Паутины

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

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

Алгоритм и электронно-цифровая подпись (ЭЦП)

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

Ревизия паролей

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

Хеширование

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

Чтобы такого не случалось, на помощь приходит хеширование — оно защищает целостность данных.

Хеш — это число, которое генерируется из текста с помощью хеш-алгоритма. Это число меньше оригинального текста.

Алгоритм хеширования

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

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

В примере ниже мы использовали алгоритм SHA-1.

Текст: Все любят пончики.Значение SHA-1 текста: daebbfdea9a516477d489f32c982a1ba1855bcd

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

Текст: Все любят пончик.Значение SHA-1 текста: 8f2bd584a1854d37f9e98f9ec4da6d757940f388

Как вы видите, поменялась одна буква, а хеш изменился до неузнаваемости.

Хеширование нужно:

  • Чтобы информация в базах данных не дублировалась;
  • Для цифровых подписей и SSL-сертификатов;
  • Чтобы найти конкретную информацию в больших базах данных;
  • В компьютерной графике.

Криптографическая соль

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

Rainbow Tables – это реализация метода time-memory trade-off, при котором нет необходимости хранить все возможные хэши. Вместо этого они разбиваются на взаимосвязанные цепочки, от которых сохраняются только начало и конец. «Радужные таблицы» требуют усилий по перебору, но перебирать нужно гораздо меньше полного диапазона, причём параметры атаки можно подобрать или вычислить заранее. Вычисление подобных таблиц занимает у хакеров длительное время, после чего сами атаки осуществляются крайне быстро.

Для противодействия подобным атакам был разработан метод, применяющий к хэшу так называемую криптографическую соль. Теперь хэш вычисляется не от самого пароля, а от комбинации пароля и добавленной к нему случайной строки («соли»). Значение соли (повторимся — это строка, состоящая из случайных данных) сохраняется рядом с хэшем; без неё восстановить правильный пароль не получится. В редких случаях в дополнение к соли используется ещё одна строка — Pepper («перец»), значение которой хранится на отдельном физическом сервере для обеспечения дополнительного уровня безопасности.

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

Разница между шифрованием, кодированием и хешированием

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

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

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

Сравнение между шифрованием, кодированием и хешированием:

шифрование

кодирование

хеширования

Имея в виду

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

Сообщение кодируется с испол

Кодирование и шифрование информации

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

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

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

То есть:

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

Для расчета таких хеш-сумм применяются специализированные скрипты. Примером применения хеша является:

  • MD5;
  • семейство SHA.

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

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

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

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

  • HTTPS,
  • TLS,
  • SSH.

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

Что такое кодирование информации

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

Типичными примерами кодирования являются:

  • передача данных по интернету, в глобальном смысле это тоже кодирование;
  • передача данных по Wi-Fi или Блютуз;
  • аудио-, видео кодеки: avi, mp3 и др.;
  • кодировки: UTF-8, ASCII, EBCDIC и др.;
  • эмоджи;
  • и др.

Кодирование информации также широко применяется не в IT-сфере:

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

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

Историческая справка

Конечно, история хеширования появилась задолго до криптовалют и появления цепи блокчейн. Впервые, идею подобного кодирования предоставил на рассмотрения сотрудник IBM Ханс Петер Лун еще в далеком 1953 году. В последующие годы предложение было актуальным для решения проблем поиска слова в большом толковом словаре. В 80-х процедура стала популярна для алгоритмизации любых структурных данных, в том числе и компьютерных. На территории России в 90-х переводом хеширования служило слово «расстановка». А в жаргонном профессиональном наречии хеш и вовсе был «окрошкой». Оба варианта так и не прижились, поэтому во всех нишах используется адаптивный перевод с помощью транслитерации — хеш.

Хеш-функции

Они обеспечивают отображение между вводом произвольной длины и выводом (обычно) фиксированной длины (или меньшей длины). Это может быть что угодно, от простого crc32 до полноценной криптографической хеш-функции, такой как MD5 или SHA1 / 2/256/512. Дело в том, что происходит одностороннее отображение. Это всегда отображение много: 1 (что означает, что всегда будут коллизии), поскольку каждая функция производит меньший результат, чем она способна ввести (если вы загрузите каждый возможный файл размером 1 МБ в MD5, вы получите массу коллизий).

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

Теперь, если вы хотите декодировать хэш, вам сначала нужно выяснить, как разбить данный хеш на его повторяющиеся состояния (1 возможность для входов, меньших, чем размер блока данных, многие для более крупных входов). Затем вам нужно будет отменить итерацию для каждого состояния. Теперь, чтобы объяснить , почему это очень трудно, представьте себе , пытаясь вывести и из следующей формулы: . Есть 10 положительных комбинаций и которые могут работать. Теперь повторите это несколько раз:. Для 64 итераций у вас будет более 10 ^ 64 возможностей, чтобы попробовать. И это всего лишь простое дополнение, в котором некоторое состояние сохраняется от итерации к итерации. Настоящие хеш-функции выполняют больше одной операции (MD5 выполняет около 15 операций с 4 переменными состояния). А поскольку следующая итерация зависит от состояния предыдущей, а предыдущая уничтожается при создании текущего состояния, практически невозможно определить состояние ввода, которое привело к заданному состоянию вывода (не меньше для каждой итерации). Добавьте к этому большое количество возможностей, и декодирование даже MD5 потребует почти бесконечного (но не бесконечного) количества ресурсов. Так много ресурсов, что это ‘На самом деле, если у вас есть представление о размере ввода (для небольших входов), это значительно дешевле, чем даже попытаться его декодировать.

Рейтинг
( Пока оценок нет )
Editor
Editor/ автор статьи

Давно интересуюсь темой. Мне нравится писать о том, в чём разбираюсь.

Понравилась статья? Поделиться с друзьями:
Люкс-хост
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: