Какво е хеширане?
Начало
Статии
Какво е хеширане?

Какво е хеширане?

Средно ниво
Публикувано Jul 29, 2019Актуализирано Jan 31, 2023
7m

Хеширането се отнася до процеса на генериране на изход с фиксиран размер от входни данни с променлив размер. Това се прави чрез използването на математически формули, известни като хеш функции (имплементирани като хеширащи алгоритми). 

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

Както конвенционалните, така и криптографските хеш функции са детерминистични. Детерминистични означава, че докато входящите данни не се променят, алгоритъмът за хеширане винаги ще произвежда един и същ изход (известен също като дайджест или хеш).

Обикновено алгоритмите за хеширане на криптовалутите са проектирани като еднопосочни функции, което означава, че не могат лесно да бъдат върнати без големи количества изчислително време и ресурси. С други думи, доста лесно е да се създаде изход от входящите данни, но сравнително трудно е да се отиде в обратната посока (да се генерират изходни данни само от изхода). Най-общо казано, колкото по-трудно е да се намерят изходните данни, толкова по-сигурен се счита алгоритъмът за хеширане.


Как работи хеш функцията?

Различните хеш функции ще генерират изходи с различни размери, но възможните изходни размери за всеки алгоритъм за хеширане винаги са постоянни. Например, алгоритъмът SHA-256 може да генерира само изходи от 256 бита, докато SHA-1 винаги ще генерира 160-битов дайджест.

За да илюстрираме, нека пуснем думите „Binance“ и „binance“ през алгоритъма за хеширане SHA-256 (този, който се използва при биткойн).

SHA-256

Вход

Изход (256 бита)

Binance

f1624fcc63b615ac0e95daf9ab78434ec2e8ffe402144dc631b055f711225191

binance

59bba357145ca539dcd1ac957abc1ec5833319ddcae7f5e8b5da0c36624784b2


Имайте предвид, че незначителна промяна (регистър на първата буква) доведе до напълно различна хеш стойност. Но тъй като използваме SHA-256, изходите винаги ще имат фиксиран размер от 256 бита (или 64 знака) - независимо от размера на входните данни. Също така, няма значение колко пъти пускаме двете думи през алгоритъма, двата изхода ще останат постоянни.

Обратно, ако пуснем същите входни данни през алгоритъма за хеширане SHA-1, ще имаме следните резултати:

SHA-1

Вход

Изход (160 бита)

Binance

7f0dc9146570c608ac9d6e0d11f8d409a1ee6ed1

binance

e58605c14a76ff98679322cca0eae7b3c4e08936


По-специално, акронимът SHA означава Secure Hash Algorithms. Отнася се до набор от криптографски хеш функции, които включват алгоритмите SHA-0 и SHA-1 заедно с групите SHA-2 и SHA-3. SHA-256 е част от групата SHA-2, заедно с SHA-512 и други варианти. В момента само групите SHA-2 и SHA-3 се считат за сигурни.


Защо те имат значение?

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

Истинската сила на хеширането идва, когато се работи с огромни количества информация. Например, човек може да пусне голям файл или набор от данни чрез хеш функция и след това да използва изхода му, за да провери бързо точността и целостта на данните. Това е възможно поради детерминистичния характер на хеш функциите: входните данни винаги ще доведат до опростен, съкратен изход (хеш). Такава техника премахва необходимостта от съхраняване и „запомняне“ на големи количества данни.

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


Криптографски хеш функции

Отново, хеш функция, която използва криптографски техники, може да бъде дефинирана като криптографска хеш функция. Като цяло разбиването на криптографска хеш функция изисква безброй опити за груба сила. За да може човек да „обърне“ криптографска хеш функция, той ще трябва да отгатне какви са изходните данни чрез проба и грешка, докато не се получи съответният изход. Съществува обаче и възможност различни входни данни да произвеждат абсолютно същия изход, в който случай възниква „сблъсък“.

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

Преди да обсъдим всяко свойство, нека обобщим тяхната логика в три кратки изречения.

  • Устойчивост на сблъсък: невъзможно е да се намерят два набора различни входни данни, които произвеждат същия хеш като изход.

  • Устойчивост на предизображение: невъзможно е да се „обърне“ функцията (намиране на входните данни от даден изход).

  • Устойчивост на второ предизображение: невъзможно е да се намери втори набор входни данни, който се сблъсква с определени входни данни.


Устойчивост на сблъсък

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

Казано по друг начин, хеш функцията е устойчива на сблъсък, когато възможността за намиране на сблъсък е толкова ниска, че ще изисква милиони години изчисления. Така че въпреки факта, че няма хеш функции без сблъсъци, някои от тях са достатъчно силни, за да се считат за устойчиви (напр. SHA-256).

Сред различните SHA алгоритми групите SHA-0 и SHA-1 вече не са сигурни, тъй като са открити сблъсъци. Понастоящем групите SHA-2 и SHA-3 се считат за устойчиви на сблъсъци.


Устойчивост на предизображение

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

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

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


Устойчивост на второ предизображение

За да опростим, можем да кажем, че устойчивостта на второ предизображение е някъде по средата между другите две свойства. Атака с второ предизображение възниква, когато някой успее да намери конкретни входни данни, които генерират същия изход на други входни данни, които вече знае.

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

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


Копаене

Има много стъпки в копаенето на биткойни, които включват хеш функции, като проверка на баланси, свързване на входове и изходи на трансакции и хеширане на трансакции в рамките на блок, за да се образува дърво на Merkle. Но една от основните причини биткойн блокчейнът да е сигурен е фактът, че копачите трябва да извършат безброй хеширащи операции, за да намерят в крайна сметка валидно решение за следващия блок.

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

В този случай хешрейтът представлява колко компютърна мощност е инвестирана в копаене на биткойни. Ако хешрейтът на мрежата се увеличи, протоколът на биткойн автоматично ще коригира трудността при копаене, така че средното време, необходимо за копаене на блок, да остане близо до 10 минути. За разлика от това, ако няколко копача решат да спрат копаенето, което води до значително спадане на хешрейта, трудността при копаене ще бъде коригирана, което ще улесни копаенето (докато средното време за блок се върне на 10 минути).

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

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


Заключителни мисли

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