Кіріспе
Деректер құрылымының түрі Криптография және компьютерлік ғылым салаларында хэш ағашы немесе Меркл ағашы – әрбір "жапырақ" түйіні дерек блогының криптографиялық хэшімен белгіленген, ал жапырақ емес түйін (тарау, ішкі түйін немесе inode деп аталады) өзінің дочерлік түйіндерінің белгілерінің криптографиялық хэшімен белгіленген ағаш. Хэш ағашы үлкен деректер құрылымының мазмұнын тиімді және қауіпсіз тексеруге мүмкіндік береді. Хэш ағашы – хэш тізімі мен хэш тізбегінің жалпылама түрі. Берілген бинарлық хэш ағашының бір бөлігі екенін көрсету үшін жапырақ түйінінің ағаштағы жапырақ түйіндері санының логарифміне пропорционал хэштерді есептеу қажет. Керісінше, хэш тізімінде бұл сан жапырақ түйіндерінің санына пропорционалды. Сондықтан Меркл ағашы – криптографиялық міндеттеме схемасының тиімді мысалы, онда ағаштың түбірі міндеттеме ретінде қарастырылады және жапырақ түйіндерін ашуға болады, олар бастапқы міндеттеменің бөлігі екенін дәлелдеуге болады. Хэш ағашының түсінігін 1979 жылы оны патенттеген Ральф Мерклдің есімімен атады.
In cryptography and computer science, a hash tree or Merkle tree is a tree in which every "leaf" node is labelled with the cryptographic hash of a data block, and every node that is not a leaf (called a branch, inner node, or inode) is labelled with the cryptographic hash of the labels of its child nodes. A hash tree allows efficient and secure verification of the contents of a large data structure. A hash tree is a generalization of a hash list and a hash chain. Demonstrating that a leaf node is a part of a given binary hash tree requires computing a number of hashes proportional to the logarithm of the number of leaf nodes in the tree. Conversely, in a hash list, the number is proportional to the number of leaf nodes itself. A Merkle tree is therefore an efficient example of a cryptographic commitment scheme, in which the root of the tree is seen as a commitment and leaf nodes may be revealed and proven to be part of the original commitment. The concept of a hash tree is named after Ralph Merkle, who patented it in 1979.
Шолу
Хаш-ағаш – хэштер ағашы, онда жапырақтар (яғни, жапырақ түйіндері, кейде «жапырақтар» деп те аталады) файл немесе файлдар жиынтығы сияқты дерек блоктарының хэштері болып табылады. Ағаштың жоғарырақ орналасқан түйіндері – олардың тиісті балаларының хэштері. Мысалы, жоғарыдағы суретте 0 хэші – 0 0 және 0 1 хэштерінің қосылуының хэштеу нәтижесі. Яғни, хэш 0 = хэш(хэш 0 0 + хэш 0 1), мұнда "+" қосылуды білдіреді. Көптеген хаш-ағаш жүзеге асырулары екілік (әр түйіннің астында екі бала түйін) болып келеді, бірақ әр түйіннің астында одан да көп бала түйіндерін пайдалануға болады. Әдетте, хэштеу үшін SHA 2 сияқты криптографиялық хэш-функция қолданылады. Егер хаш-ағаш тек қасақана зақымданудан қорғау үшін ғана қажет болса, CRC сияқты сенімсіз тексеру сомаларын қолдануға болады. Хаш-ағаштың жоғарғы жағында жоғарғы хэш (немесе түбір хэш немесе бас хэш) орналасқан. P2P желісінде файлды жүктемес бұрын, көбінесе жоғарғы хэш сенімді дереккөзден, мысалы, дос немесе жүктеуге ұсынылатын файлдары бар веб-сайттан алынады. Жоғарғы хэш қолжетімді болған кезде, хаш-ағашты P2P желісіндегі кез келген сенімсіз дереккөзден, мысалы, кез келген қатысушыдан алуға болады. Содан кейін алынған хаш-ағаш сенімді жоғарғы хэшпен салыстырылады, және егер хаш-ағаш зақымдалған немесе жалған болса, бағдарлама жоғарғы хэшпен сәйкес келетін хаш-ағашты тапқанша басқа дереккөзден хаш-ағаш іздейді. Хаш тізімінен басты айырмашылығы – хаш-ағаштың бір тармағын бір уақытта жүктеуге болады және бүкіл ағаш әлі қолжетімді болмаса да, әр тармақтың тұтастығын дереу тексеруге болады. Мысалы, суретте L2 дерек блогының тұтастығын дереу тексеруге болады, егер ағашта 0 0 және 1 хэштері болса, дерек блогын хэштеу арқылы және нәтижені 0 0 хэшімен, содан кейін 1 хэшімен біріктіріп, соңында нәтижені жоғарғы хэшпен салыстыру арқылы. Сол сияқты, L3 дерек блогының тұтастығын ағашта 1 1 және 0 хэштері болса тексеруге болады. Бұл тиімді, өйткені файлдарды өте кішкентай дерек блоктарына бөлуге болады, сондықтан олар зақымдалған жағдайда тек кішкентай блоктарды қайта жүктеу қажет. Хэштелген файл үлкен болса, мұндай хаш тізімі немесе хаш тізбегі өте үлкен болады. Бірақ егер ол ағаш болса, бір кішкентай тармақты жылдам жүктеуге болады, тармақтың тұтастығын тексеруге болады, содан кейін дерек блоктарын жүктеу басталады.
Екінші преимажға шабуыл
Меркл хэш түбірі ағаштың тереңдігін көрсетпейді, бұл шабуылшыға бастапқы құжаттан өзге, бірақ сол Меркл хэш түбіріне ие құжат жасауға мүмкіндік беретін екінші преобраз атағына жол ашады. Мысалы, шабуылшы екі дерек блогынан тұратын жаңа құжатты құруы мүмкін, онда бірінші блок – хэш 0 0 + хэш 0 1, ал екінші блок – хэш 1 0 + хэш 1 1 болады. Осы мәселені шешудің қарапайым жолы «Сертификат ашықтығы» стандартында көрсетілген: жапырақ түйіндерінің хэшін есептегенде, хэш деректеріне 0x00 байты қосылады, ал ішкі түйіндердің хэшін есептегенде 0x01 қосылады. Tiger tree хэштері Gnutella, Gnutella2 және Direct Connect P2P файл алмасу протоколдарында, сондай-ақ Phex, BearShare, LimeWire, Shareaza, DC++ және gtk gnutella сияқты файл алмасу бағдарламаларында қолданылады.