Криптографическая хеш-функция,
хеширование, криптонит и воздействие его на супермена,
хотя нет, последнее кажется не из этой оперы, а вот о
хешировании вы точно сегодня много чего узнаете, а это
важно для целостного понимания устройства работы блокчейна!Здравствуйте,
Эдуард на связи и это второе видео из серии «биткоин
для новичков» где вы узнаете как устроена криптовалюта.
И Тема сегодняшнего видео — хеширование приятного
просмотраСлово хеш происходит от английского «hash», одно
из значений которого трактуется как путаница или мешанина.
Собственно, это довольно полно описывает реальное
значение этого термина. Часто еще про такой процесс
говорят «хеширование», что опять же является производным
от английского hashing (рубить, крошить, спутывать и т.п.).
Появился этот термин в середине прошлого века
среди людей занимающихся обработках массивов данных
и Хеш-функция позволяла привести любой массив данных к числу
заданной длины. Проще всего хеширование
представить как шифр. Берется какой-нибудь текст, шифруется
по определенной системе, где на выходе получается
билиберда. Эту билиберду можно превратить обратно
в текст, если вы знаете, как именно билиберду шифровали.
Например, берем цифру 5, шифруем ее, например умножаем
на 4, и получаем 20. Если разделить 20 на 4, получим исходную
информацию — 5.В данном случае ключем к расшифровке
является цифра 4 Буквенные шифры работают
сложнее. И чтобы зашифровать текст Можно каждой букве
присвоить свой номер, и таким образом зашифровать
текст в виде набора чисел., также Можно сдвинуть алфавит
на два символа влево и получить трудночитаемый набор букв.
Или же записать текст азбукой Морзе и получить последовательность
точек и тире. Кстати, азбука Морзе вам
ничего не напоминает? Если Морзе кодировал буквы и
цифры последовательностью точек и тире, то наши компьютеры
кодируют все единицами и нулями. Одно значение
(единица или ноль) называется битом. Если присвоить каждой
букве латинского алфавита порядковый номер, то для
передачи одной буквы понадобиться всего 4 бита. Учитывая пробелы,
прописные и заглавные буквы и разные символы, получается
7 бит или один байт с нулем в начале. Весь текст сценария
для этого видео поместится в 47 килобайт, что равно
385 тысячам бит. Так Почему же для передачи
и хранения цифровых данных выбрали аналог морзянки,
а не что-то вычурное? Потому что компьютеры работают
на электричестве. Если по кабелю не течет ток — компьютер
регистрирует ноль. Если течет — единицу. Все просто.
А при мощности современного интернета, по кабелям можно
надежно передавать 100 миллионов бит в секунду и даже больше
Но, что будет, если компьютер на мгновение подвиснет
и пропустит несколько единичек и нулей? Информация, которую
он примет после подвисания, может оказаться нечитаемой.
Для расшифровки битов в понятные нам буквы нужен
полный и последовательный набор битов, иначе вместо
оригинального текста компьютер получит нечитаемый массив
из битов. Вот тут как раз и необходимо
хеширование, а точнее нужна хеш-сумма
Например: У нас есть проблема — мы получили зашифрованный
текст и у нас на руках есть ключ к дешифровке, то мы
никак не можем узнать, правильно ли зашифрован текст и ничего
ли не потеряли при передаче шифра. Ведь если потеряли
— то при дешифровке получится билиберда, не имеющая ничего
общего с оригинальным текстом. Самый простой способ проверить
шифр на “потеряшек” — перед шифрованием посчитать
количество символов в шифруемом тексте. Возьмем знаменитое
“Lorem ipsum”. В фразе 11 символов, включая пробел. Как помним,
одна буква латинского алфавита кодируется семью битами.
Значит двоичный код Lorem ipsum состоит из 77 бит.
Передаем зашифрованный текст на другой компьютер,
добавляем послание с размером исходного файла. Само Послание
обрамляется специальной комбинацией битов (так
называемым флагом), которую компьютер воспринимает
как установку “Должно прийти 77 бит информации, пересчитайте”.
Получатель проверяет принятый текст, считает биты. Если
их 77 — начинает декодировать текст. Если меньше, тогда
понимает, что файл был получен не полностью и просит переслать
текст еще раз. Информация о количестве
бит — самый простой пример хеширования, а точнее — хеш-суммы.
Хеширование позволяет установить, соответствует
ли полученный файл оригиналу.То есть простые хэш-функции (не
надежные, но быстро рассчитываемые) применяются при проверке
целостности передачи пакетов по протоколу TCP/IP (и ряду
других протоколов и алгоритмов, для выявления аппаратных
ошибок и сбоев — это так называемое избыточное
кодирование). Если рассчитанное значение хеша файла совпадает
с хешем отправленным вместе с пакетом информации, а
этот хеш еще называют контрольной суммой, то значит потерь
по пути не было значит можно переходить к следующему
пакету ифнормации. А это, ведь на минутку, основной
протокол передачи данных в сети интернет. И Без него
никуда.Хеширование так-же часто используютДля доступа
к сайтам и серверам по логину и паролю . Согласитесь,
что хранить пароли в открытом виде для их сверки с теми
что вводят пользователи, довольно ненадежно, ведь
их могут похитить. Поэтому сайты хранят не пароли, а хеши
всех паролей. Пользователь вводит символы своего пароля,
мгновенно рассчитывается хеш-сумма введенного пароли
и сверяется с тем хешем, что есть в базе. Это Надежно
и очень просто. Поэтому даже администраторы нормальных
ресурсов и сами не знают ваших паролей, и Обычно
для такого типа хеширования используют сложные функции
с очень высокой криптостойкостью, чтобы по хэшу нельзя было
бы восстановить пароль. Давайте еще рассмотрим
пример хеширования посложнееДля этого сначала разберем
один вопрос, а именно В чем проблема способа
с подсчетом количества бит как мы с вами рассмотрели
выше? А проблема в том, что под 77 бит можно подогнать
и “Lorem ipsum”, и “Здравствуй!” и любые другие одинадцать
символов. Простой подсчет количества бит информации
не позволяет проверить полученный текст на полное
соответствие оригиналу. Совпадение хеш-суммы разных
файлов называется коллизией и Плохой алгоритм хеширования
дает большое количество коллизий. Наш алгоритм
подсчета количества бит — плохой. Значит, хеш-сумму
надо считать иначе. Хороший алгоритм в практическом
применении не дает коллизий вообще. Это значит, что
любому тексту, картинке или файлу можно присвоить
уникальный идентификатор (то есть, хеш-сумму), который
рассчитывается исходя из самого файла. И желательно,
чтобы хеш-сумма была небольшой, и одинакового размера для
всех файлов, чтобы уменьшить риск потерять биты самой
хеш-суммы во время ее передачи. Алгоритмов много, но нас
пока интересует лишь один — SHA-256, который используется
в Биткоине и сотнях других криптовалют.Но прежде чем
мы продолжим, Минутка саморекламы. Если вам мало видео которые
выходят на моем ютуб канале – подписывайтесь на мой
телеграм канал. Потому что я физически не успеваю
делать больше одного видео в сутки, а наработок у меня
много. Поэтому интересные статьи, заметки и мысли
я публикую в телеграме. Ссылка в описании. Жмите
на паузу и Подписывайтесь, подписались, тогда продолжим
и теперь рассмотрим алгоритм SHA-1, ведь так будет проще
понять алгоритм SHA-256 SHA-1 придумали в Агенстве
Национальной Безопасности США, небезызвестном NSA.
Алгоритм предназначался для цифровой подписи документов
и проверки их подлинности. Получатель принимал документ
и подпись в виде хеш-суммы оригинала. Затем самостоятельно
считал хеш-сумму принятого документа и сравнивал ее
с полученной подписью. Если хеш-суммы совпадают
— значит полученный документ полностью идентичен оригинальному.
SHA-1 работает так. Исходный файл разбивается на блоки
по 512 бит в каждом. Затем алгоритм определяет четыре
ключа, которые не меняются в процессе хеширования,
и каждый из ключей весит по 32 бита и необходим для
проведения хеширования. Определяются пять случайных
переменных, по длине равных ключам. Первый блок преобразуется
в 80 32-х битных слов, которые состоят из цифр и первых
6 букв латинского алфавита — A, B, C, D, E и F.
80 слов разбивают на 4 части по 20 слов и каждую часть
прогоняют по хитрой формуле с использованием четверых
постоянных ключей и пяти переменных. В итоге получают
пять слов, каждое состоит из 32 бит. Эти же слова используются
как переменные для хеширования следующего блока из 512 бит.
Таким образом, хеш-сумма каждого блока напрямую
завязана на хеш-сумму предыдущего блока, кроме первого и При
хешировании каждого блока используются одинаковые
ключи и хеш-сумма предыдущего блока. Таким образом Хеш-сумма
любого файла это 5 слов по 32 бита или 160 бит в целом.
Теперь об интересном. Зная постоянные ключи, которые
использовались для хеширования файла, можно из тех 160 бит
восстановить весь документ, просто решая задачу с конца.
Это называется «обратным преобразованием». И вообще-то
алгоритмы хеширования стараются придумать так,
чтобы это самое обратное преобразование было как
можно более сложным процессом. В упрощенном виде обратное
преобразование выглядит так:
Например У нас есть файл (скажем число 4) и ключ (напрмиер
число 5). Мы хешируем файл, используя ключ (то есть,
умножаем 4 на 5), получаем хеш-сумму — число 20. Если
мы знаем хеш-сумму, ключ, по которому хешировали
файл, и алгоритм хеширования, то можем просто посчитать
формулу в обратном порядке — поделить 20 на 5 и получим
наше исходное значение файла
А теперь, вопрос?. Действительно ли хеш-сумма по SHA-1 полностью
соответствует оригинальному файлу или кажется случайным
набором букв и цифр? Что будет, если чуть-чуть изменить
исходный файл? Вот, сравните. Отличия — во
второй фразе букву P я написал заглавной.
Такая вот кардинальная перемена результата при
малейшем изменении исходного файла получила название
“эффекта лавины» или лавинный эффект.
Алгоритм SHA-1 оказался неплохим, но все же уязвимым к коллизиям
и обратному преобразованию, хотя восстановление файла
по его хешу без знания ключей займет в лучшем случае
несколько миллиардов лет. Но Когда на горизонте замаячили
квантовые компьютеры, от алгоритма SHA-1 отказались
все крупные IT компании, включая Гугл и Яндекс.
Да и создатель алгоритма, нацбезопасность США, начала
думать над чем-то понадежней. На смену SHA-1 пришел SHA-2.
SHA-2 работает по схожему принципу, но использует
только один ключ и более хитрые формулы для хеширования.
Базовый принцип остался тем же — файл разбивается
на блоки, хеш-сумма каждого блока основана на хеш-сумме
предыдущего. Криптовалюты Биткоин же
работает на алгоритме SHA-256, некой модификации сырого
SHA-2. Только на выходе получается не 5 слов, как в первой версии,
а целых 8. Восемь 32-х битных слов образуют хеш-сумму
размером 256 бит — отсюда и название алгоритма.
SHA—256 это классический алгоритм для криптовалют: на нем построена не только основная криптовалюта — Bitcoin,
Но и Соответственно в форках биткоина таких как Bitcoin Cash, Bitcoin Gold, Bitcoin
Diamond. используется этот же алгоритм
Помимо этих монет, SHA—256 используется также в: * Steemit;
* DigiByte; * PeerCoin;
* NameCoin; * TeckCoin;
* Ocoin; * Zetacoin;
* EmerCoin.И многих других Также алгоритм SHA-256 используется
как подпрограмма в криптовалюте Litecoin, а основным алгоритмом
для майнинга там является Scrypt.Но эти все монеты темы
совсем другой рубрики, поэтому просто продолжим
говорить о хешированииДавайте систематизируем кое-что
из уже сказанногоВ общем процесс хеширования – это
череда математических воздействий которым подвергаются
данные произвольной длины для преобразования на выходе
в битовую строку фиксированной длины. И Каждый из алгоритмов
работает по своему, но хорошаяхеш-функция должна обладать следующими
свойствами 1. Как уже было сказано,
функция эта должна уметь приводить любой объем цифровых
двоичных данных к числу заданной длины (по сути
это сжатие до битовой последовательности заданной длины хитрым способом).
2. При этом малейшее изменение (хоть на один бит) входных
данных должно приводить к полному изменению хеша.,
то есть к лавинному эффекту 3. Также Хеш функция должна
быть стойкой к обратной операции, т.е. вероятность
восстановления исходных данных по хешу должна быть
весьма низкой, хотя это сильно зависит от задействованных
над задачей обратного преобразования вычислительных мощностей,
но об этом я наверное расскажу в видео про квантовые компьютеры,
так что подпишитесь чтобы его не пропустить
4. Еще В идеале хеш функция должна иметь как можно
более низкую вероятность возникновения коллизий.
Согласитесь, что не круто будет, если из разных массивов
данных будут часто получаться одни и те же значения хэша
5. Также Хорошая хеш-функция не должна сильно нагружать
железо при своем исполнении. От этого сильно зависит
скорость работы системы на ней построенной. И хеш
функций много и всегда имеется компромисс между
скоростью работы и качеством получаемого результата.
6. И еще очень желательно, чтобы Алгоритм работы функции
должен быть открытым, чтобы любой желающий мог бы оценить
ее криптостойкость, т.е. вероятность восстановления
начальных данных по выдаваемому хешу. Все это обязательные условия
хорошей хеш функции и Хеширование очень важно
для работы блокчейна. Как вы возможно знаете, все,
что записано в блокчейне, уже никак нельзя изменить
или удалить. А все потому, что данные в блокчейн записываются
в виде хеш-суммы всего блока. А хеш-сумма блока рассчитывается
с использованием хеш-суммы предыдущего блока, то есть
исходная информация блока состоит не только от его
содержания, но и в том числе и из хеш суммы предыдущего
блока и поэтому Малейшее изменение данных
в старом блоке вызовет эффект лавины, и блокчейн
просто отбросит блок со странной хеш-суммой. Именно
поэтому никто и никогда не смог взломать Биткоин.
И Именно поэтому советуют подождать шесть подтверждений
в сети, чтобы сформировалось шесть и больше блоков, ведь
вероятность, что один майнер посчитает шесть и больше
блоков ничтожно мала, поэтому чем больше прошло времени
и подтверждений после транзакции в сети биткоин, тем надежнее
можно считать эту транзакцию И Это все связано с майнингом,
который так-же основан на хешировании. Об этом
я расскажу в следующем видео, которое выйдет на
следующей неделе. Поэтому Не забудьте подписаться
на канал, а если вы уже подписаны — тогда жмите на колокольчик
и делитесь этим видео с друзьями. Чем больше просмотров
и лайков — тем чаще я буду стараться снимать для вас
видео на всякие интересные темы.Спасибо за просмотр,
до скорого