Към съдържанието
ДаретеEN

Криптография

Хеш функция

Хеш функция биткойн превръща всякакви данни в отпечатък с фиксиран размер. Вижте как биткойн ползва SHA-256, HASH256, HASH160 и tagged hash.

От Dimitar Zurnov · Обновено на 4 ноември 2026
Адаптирано от Learn Me a Bitcoin на Greg Walker.

Хеш функцията превръща всякакви данни в кратък отпечатък с фиксиран размер, наречен хеш. Биткойн (bitcoin) използва най-често SHA-256. Върху него той изгражда и две комбинации: HASH256, който прилага SHA-256 два пъти, и HASH160, който след SHA-256 прилага RIPEMD-160. Хешовете свързват блоковете и трансакциите и задвижват майнинга, при който хешът на блока трябва да падне под целта.

Какво е хеш функция?

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

Байтовете на хеша обикновено се показват като шестнадесетични знаци. Всеки байт се превръща в две шестнадесетични цифри, така че 32-байтовият изход на SHA-256 има 64 знака.

Какво прави хеш функцията силна?

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

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

Силните хеш функции проявяват и лавинния ефект. Малка промяна във входа променя около половината от битовете на изхода.

Какво се случва, когато се промени един бит?

SHA-256 на байтовете 00 и 01 се различава в 139 от 256 бита, показано като решетка. Промяна на един бит от входа SHA-256 на байта 00, после на байта 01: SHA-256 на 00: 6e340b9cffb37a989ca544e6bb780a2c 78901d3fb33738768511a30617afa01d SHA-256 на 01: 4bf5122f344554c53bde2ebb8cd2b7e3 d1600ad631c385a5d7cce23c7785459a Всеки квадрат е един бит от хеша за 01. Оранжево: битът се различава от 00 (139 от 256). Сиво: битът е същият.
Входовете се различават с един бит, но 139 от 256-те изходни бита са различни.

Решетката по-горе показва лавинния ефект. Байтът 00 и байтът 01 се различават с един бит, но SHA-256 хешовете им нямат видим модел. Около половината битове се променят, точно както трябва при добра хеш функция. Тъй като изходът е непредсказуем, никой не може да избере вход, за да получи желания резултат. Биткойн разчита на това свойство при майнинга.

Кои хеш функции използва биткойн?

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

Метод Изграден от Изход Основна употреба в биткойн
SHA-256 Един кръг SHA-256 32 байта Хешове на скриптове в P2WSH и в tagged hash
HASH256 SHA-256, приложен два пъти 32 байта Хешове на блокове, TXID, Меркъл корени, контролни суми, хешове за подписване
HASH160 SHA-256, после RIPEMD-160 20 байта Хешове на публични ключове (P2PKH, P2WPKH) и на скриптове (P2SH)
Tagged hash SHA-256 с таг отпред 32 байта Подписи Schnorr и Taproot
HMAC-SHA512 SHA-512 с таен ключ 64 байта Дъщерни ключове в HD портфейлите
PBKDF2 HMAC-SHA512, изпълнен 2,048 пъти 64 байта Сийдът от мнемоничната фраза

Стандартът FIPS 180-4 определя SHA-256. RIPEMD-160 е дефиниран в статия от 1996 г. на изследователи от KU Leuven.

Как се изчислява HASH256?

HASH256 е най-разпространеният метод. Хеширате данните веднъж със SHA-256, после хеширате 32-байтовия резултат отново със SHA-256.

HASH256 на байта aa: SHA-256 два пъти, което дава e51600d4... като 32 байта. Вход: един байт, 0xaa aa SHA-256 SHA-256 веднъж: 32 байта bceef655b5a034911f1c3718ce056531 b45ef03b4c7b1f15629e867294011a7d SHA-256 отново HASH256: 32 байта e51600d48d2f72eb428e78733e01fbd6 081b349528335bf21269362edfae185d Експлорърите го показват в обратен ред.
Входът е един байт, 0xaa. Резултатът започва с e51600d4.
import hashlib

def hash256(data: bytes) -> bytes:
    return hashlib.sha256(hashlib.sha256(data).digest()).digest()

print(hash256(bytes.fromhex("aa")).hex())
# e51600d48d2f72eb428e78733e01fbd6081b349528335bf21269362edfae185d

Блоковите хешове и TXID-овете, показани от bitcoin-cli, се появяват в обратен ред на байтовете. Суровите байтове са същите, само показването е различно. Страницата за реда на байтовете обяснява обръщането.

Как се изчислява HASH160?

HASH160 хешира данните първо със SHA-256, после с RIPEMD-160. Втората стъпка скъсява резултата от 32 на 20 байта, което прави адресите по-кратки.

HASH160 на байта aa: SHA-256, после RIPEMD-160, което дава 58d179ca... като 20 байта. Вход: един байт, 0xaa aa SHA-256 Резултат от SHA-256: 32 байта bceef655b5a034911f1c3718ce056531 b45ef03b4c7b1f15629e867294011a7d RIPEMD-160 HASH160: 20 байта 58d179ca6112752d00dc 9b89ea4f55a585195e26 За хешове на ключове и скриптове.
Входът е един байт, 0xaa. 20-байтовият резултат започва с 58d179ca.
import hashlib

def hash160(data: bytes) -> bytes:
    return hashlib.new("ripemd160", hashlib.sha256(data).digest()).digest()

print(hash160(bytes.fromhex("aa")).hex())
# 58d179ca6112752d00dc9b89ea4f55a585195e26

Публичният ключ е дълъг 33 или 65 байта. Хеширането му с HASH160 дава 20-байтовия хеш на публичния ключ, който носят повечето адреси. Хешовете на P2SH скриптовете също използват HASH160.

Какво е tagged hash?

Tagged hash добавя име, тага, пред данните. Подписите Schnorr и Taproot дефинират хешовете си така, че хеш, направен за една цел, да не може да се обърка с хеш, направен за друга. BIP 340 дефинира схемата така:

tagged_hash(tag, msg) = SHA256(SHA256(tag) || SHA256(tag) || msg)
Tagged hash по BIP 340: SHA-256 от хеша на тага, записан два пъти, и съобщението. Таг: име, например BIP0340/challenge SHA-256 на тага 32 байта, използвани два пъти хеш на тага хеш на тага съобщение Два пъти хешът на тага дава 64 байта. Така се запълва точно един блок SHA-256. SHA-256 Tagged hash: 32 байта Всеки таг дава собствен контекст.
Хешът на тага се повтаря, така че префиксът да запълни точно един 64-байтов блок на SHA-256.

Повтарянето на хеша на тага е трик за скорост. Префиксът е 64 байта и запълва точно един блок на SHA-256, така че една реализация може да изчисли този блок веднъж и да го използва повторно.

import hashlib

def tagged_hash(tag: str, msg: bytes) -> bytes:
    t = hashlib.sha256(tag.encode()).digest()
    return hashlib.sha256(t + t + msg).digest()

print(tagged_hash("BIP0340/challenge", b"").hex())
# c216d352f5818b7b4beacd4ae0a26fe888080823d2a598856661bcd54f1b3713

Taproot използва същата конструкция със свои тагове, например TapSighash, дефинирани в BIP 341.

Защо има значение типът на входа?

Често срещана грешка е да се хешира шестнадесетичният текст, а не байтовете, които той означава. Текстът ab са два ASCII знака, 0x61 и 0x62. Байтът 0xab е една стойност. Хешовете им са различни.

import hashlib

print(hashlib.sha256(b"ab").hexdigest())                 # текстът "ab"
# fb8e20fc2e4c3f248c60c39bd652f3c1347298bb977b8b4d5903b85055620603
print(hashlib.sha256(bytes.fromhex("ab")).hexdigest())   # байтът 0xab
# 087d80f7f182dd44f184aa86ca34488853ebcc04f0c60d5294919a466b463831

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

Къде използва биткойн хеширане?

Хеширането се среща почти навсякъде в биткойн:

  • Хеш на блока: HASH256 на 80-байтовото заглавие на блока. Майнингът търси заглавие, чийто хеш е под целта.
  • Меркъл корен (Merkle root): хешира TXID-овете по двойки, докато получи един корен за целия блок.
  • TXID: HASH256 на трансакция, използван като нейн референтен номер.
  • Контролна сума: първите 4 байта от HASH256, добавени към адресите в Base58, за да се хванат грешките при въвеждане.
  • Хешът за подписване (sighash): съобщението, което покрива всеки подпис.
  • Разширени ключове: HMAC-SHA512 създава всеки дъщерен ключ от родителския.
  • Сийдът от мнемоничната фраза: PBKDF2 превръща думите и незадължителната парола в 64-байтов сийд.

Защо HASH256 се прилага два пъти?

Сатоши Накамото никога не е обяснил двойното хеширане. Една вероятна причина е атаката с удължаване на дължината (length extension attack), която може да има значение, когато хешът покрива тайни данни. Повечето хешове в биткойн покриват публични данни, при които тази атака няма значение, така че допълнителният кръг днес е най-вече особеност. По-новите схеми са го премахнали, където са могли. P2WSH, дефиниран в BIP 141, използва един SHA-256 за хеша на скрипта. Двойното хеширане е особеност на биткойн, която трябва да познавате, но не е правило, което да копирате.

Какво следва?

Хешът превръща данните в отпечатък, но не може да докаже кой ги е създал. За това биткойн използва крива. Продължете с математиката на елиптичната крива, после със страниците за ECDSA и подписите Schnorr.

В този раздел: Криптография

Целият курс „Биткойн от нулата“

Нещо не изглежда наред? Кажете ни