Сравнивайте с английским: нажмите на абзац — оригинал откроется в окне. Кнопка EN под абзацем показывает его прямо в тексте.
Содержание
Введение
Тип структуры данных
Type of data structure
В криптографии и информатике хеш-дерево, или дерево Меркла, — это дерево, в котором каждый "листовой" узел помечен криптографическим хешем блока данных, а каждый узел, который не является листом (называемый ветвью, внутренним узлом или 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. Это может быть преимуществом, поскольку эффективно разбивать файлы на очень маленькие блоки данных, так что только небольшие блоки нужно будет повторно загружать в случае повреждения. Если хешируемый файл большой, такой хэш-список или хэш-цепочка становится довольно объёмным. Но если это дерево, то можно быстро загрузить одну небольшую ветвь, проверить целостность ветви, а затем начать загрузку блоков данных.
A hash tree is a tree of hashes in which the leaves (i. e., leaf nodes, sometimes also called "leafs") are hashes of data blocks in, for instance, a file or set of files. Nodes farther up in the tree are the hashes of their respective children. For example, in the above picture hash 0 is the result of hashing the concatenation of hash 0 0 and hash 0 1. That is, hash 0 = hash( hash 0 0 + hash 0 1 ) where "+" denotes concatenation. Most hash tree implementations are binary (two child nodes under each node) but they can just as well use many more child nodes under each node. Usually, a cryptographic hash function such as SHA 2 is used for the hashing. If the hash tree only needs to protect against unintentional damage, unsecured checksums such as CRCs can be used. In the top of a hash tree there is a top hash (or root hash or master hash). Before downloading a file on a P2P network, in most cases the top hash is acquired from a trusted source, for instance a friend or a web site that is known to have good recommendations of files to download. When the top hash is available, the hash tree can be received from any non trusted source, like any peer in the P2P network. Then, the received hash tree is checked against the trusted top hash, and if the hash tree is damaged or fake, another hash tree from another source will be tried until the program finds one that matches the top hash. The main difference from a hash list is that one branch of the hash tree can be downloaded at a time and the integrity of each branch can be checked immediately, even though the whole tree is not available yet. For example, in the picture, the integrity of data block L2 can be verified immediately if the tree already contains hash 0 0 and hash 1 by hashing the data block and iteratively combining the result with hash 0 0 and then hash 1 and finally comparing the result with the top hash. Similarly, the integrity of data block L3 can be verified if the tree already has hash 1 1 and hash 0. This can be an advantage since it is efficient to split files up in very small data blocks so that only small blocks have to be re downloaded if they get damaged. If the hashed file is big, such a hash list or hash chain becomes fairly big. But if it is a tree, one small branch can be downloaded quickly, the integrity of the branch can be checked, and then the downloading of data blocks can start.
Вторая атака на преимущество
Хэш-дерево Меркла не указывает глубину дерева, что делает возможной атаку второго прообраза, при которой злоумышленник создает документ, отличный от исходного, но имеющий тот же корневой хэш Меркла. В приведенном выше примере злоумышленник может создать новый документ, содержащий два блока данных, где первый является суммой хэшей 0 0 и 0 1, а второй – суммой хэшей 1 0 и 1 1. Простое решение описано в спецификации Certificate Transparency: при вычислении хэшей листовых узлов к данным хэша добавляется префикс 0x00, а при вычислении хэшей внутренних узлов – префикс 0x01. Хэширование в виде дерева Тигра используется в протоколах P2P обмена файлами Gnutella, Gnutella2 и Direct Connect, а также в приложениях для обмена файлами, таких как Phex, BearShare, LimeWire, Shareaza, DC++ и gtk gnutella.
The Merkle hash root does not indicate the tree depth, enabling a second preimage attack in which an attacker creates a document other than the original that has the same Merkle hash root. For the example above, an attacker can create a new document containing two data blocks, where the first is hash 0 0 + hash 0 1, and the second is hash 1 0 + hash 1 1. One simple fix is defined in Certificate Transparency: when computing leaf node hashes, a 0x00 byte is prepended to the hash data, while 0x01 is prepended when computing internal node hashes. Tiger tree hashes are used in Gnutella, Gnutella2, and Direct Connect P2P file sharing protocols and in file sharing applications such as Phex, BearShare, LimeWire, Shareaza, DC++ and gtk gnutella.