Кодирование/шифрование/хэширование/обфускация: разберемся в терминологии

Вы, наверное, сталкивались с такими терминами, как:

  • кодирование (encoding);
  • шифрование (encryption);
  • хеширование (hashing);
  • обфускация (obfuscation);

… но не знали точно, в чем между ними разница. Давайте разберемся раз и навсегда.

Кодирование (encoding)

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

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

Примеры: ASCII, Unicode, URL Encoding, Base64.

Шифрование (encryption)

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

Примеры: AES, RSA, Blowfish.

Хеширование (hashing)

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

Если вы использовали систему версионирования Git, то там хэш коммита это результат применения хеш-функции к дельте, то есть изменениям в этом коммите.

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

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

Короче, применений вагон и маленькая тележка =)

Примеры: SHA-3, MD5 и другие.

Обфускация (obfuscation)

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

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

Скрыть исходники полностью в мире JS не представляется возможным, хотя реверс-инжиниринг применяют даже к скомпилированным в машинные коды программам и получают результаты в виде «крякнутых» программ стоимостью тысячи долларов. Было бы желание и знания, а там — ничего невозможного практически нет.

Всем удачного кодинга!