SHA-256 to ściśle określona procedura obliczająca odcisk danych, zwany hashem. Te same dane wejściowe zawsze dają ten sam wynik o długości 256 bitów: 32 bajty, zwykle zapisane jako 64 znaki szesnastkowe. Bitcoin używa jej do łączenia i sprawdzania danych oraz w kopaniu. Odcisk nie jest jednak zaszyfrowaną kopią pierwotnej treści.
Wyobraź sobie, że ktoś przesyła ci plik i jego hash. Obliczając go samodzielnie, możesz sprawdzić, czy pobrane dane odpowiadają podanemu odciskowi. Nawet mała zmiana wejścia z bardzo dużym prawdopodobieństwem zmieni cały wynik. Sam odcisk nie mówi jednak, kto stworzył plik ani czy jest on bezpieczny. Jeśli napastnik podstawi plik wraz z jego hashem, będą do siebie pasować. Dlatego ważna jest również wiarygodność źródła wartości porównawczej. [1] [5]
Dla trzech bajtów ASCII abc, bez cudzysłowów i znaku końca wiersza, wynikiem jest ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad. To nie jest losowo wygenerowana liczba: każda poprawna implementacja uzyska z tych samych bajtów właśnie ten wynik. Dodanie spacji lub znaku końca wiersza zmienia wejście. Inny hash nie oznacza wtedy błędu algorytmu. W przypadku tekstu znaczenie ma też jego kodowanie. [3]
Szyfrowanie ma umożliwiać odzyskanie wiadomości przy użyciu klucza. SHA-256 nie ma takiego klucza ani procedury odwrotnej. Można jednak próbować prawdopodobnych danych wejściowych: ktoś, kto podejrzewa, że haszowany był czterocyfrowy PIN, może sprawdzić wszystkie 10 000 kombinacji i porównać wyniki. Długi hash nie dodaje więc słabemu sekretowi brakującej entropii (czyli nieprzewidywalności danych wejściowych). Bezpieczeństwo zależy również od tego, ile możliwości napastnik rzeczywiście musi sprawdzić. [5] [7]
Identyfikatory bloków, txid (identyfikatory transakcji) i łączenie par hashy w Merkle Tree (drzewie powiązanych hashy) wykorzystują SHA256(SHA256(data)). Drugi przebieg przetwarza 32 surowe bajty pierwszego wyniku, a nie jego zapis tekstowy liczący 64 znaki. Wynik nadal ma 256 bitów. Podwójne haszowanie jest tu regułą protokołu, nie dowodem złamania pojedynczego SHA-256. Bitcoin stosuje też inne konstrukcje: na przykład Taproot dodaje do wejścia ustalone znaczniki, aby rozdzielić różne zastosowania haszowania. [2] [4] [6]
Górnik wielokrotnie zmienia dozwolone dane w nagłówku kandydującego bloku i oblicza jego podwójny SHA-256. Szuka wyniku, który jako liczba nie przekracza ustalonej wartości granicznej (target). Nie odszyfrowuje wiadomości ani nie szuka cudzego klucza prywatnego. Znalezienie odpowiedniego nagłówka wymaga wielu prób; jego sprawdzenie jest szybkie. Nagłówek wskazuje też poprzedni blok, więc zmiana starszego bloku narusza kolejne powiązania. Full Node (węzeł samodzielnie sprawdzający reguły Bitcoina) dodatkowo weryfikuje transakcje i pozostałe reguły: sam odpowiedni hash nie sprawi, że nieprawidłowy blok stanie się prawidłowy. [4]
Możliwych wiadomości jest więcej niż 256-bitowych odcisków, więc niektóre różne wejścia muszą dawać ten sam hash. To kolizja. Liczy się to, czy potrafimy ją celowo znaleźć. Dla idealnego hasha o długości 256 bitów ogólne poszukiwanie dowolnej kolizji wymaga rzędu 2^128 prób; znalezienie wejścia dla z góry ustalonego odcisku — rzędu 2^256. To różne zadania. Znalezienie kolizji samo w sobie nie ujawnia klucza prywatnego Bitcoina. Te liczby nie gwarantują też bezpieczeństwa całego portfela czy protokołu. [5]
SHA-256 jest składnikiem, a nie gotowym rozwiązaniem każdego problemu bezpieczeństwa. Celowo działa szybko, dlatego sam nie nadaje się do przechowywania haseł wymyślonych przez ludzi: napastnik mógłby szybko sprawdzać kolejne propozycje. Służą do tego specjalne metody wyprowadzania wartości z hasła, na przykład o regulowanym koszcie obliczeń. Podobnie własny przepis „coś zahaszuję i mam bezpieczny klucz” nie rozwiązuje problemu pierwotnej losowości ani ujawnienia wejścia. Zwykle użytkownik nie musi obliczać SHA-256 ręcznie; powinien rozumieć, czego dowodzi sprawdzony odcisk, a czego nie. [8] [7]
SHA-256 należy do rodziny SHA-2, a jego działanie opisuje NIST FIPS 180-4. Przed obliczeniem uzupełnia wejście, w tym informację o jego długości, i przetwarza je w 512-bitowych fragmentach, każdy w 64 rundach. Te wewnętrzne bloki mają 64 bajty i nie są blokami Bitcoina. Nagłówek bloku Bitcoina ma 80 bajtów; cały blok zawiera dodatkowo transakcje. Liczba 256 w nazwie oznacza długość wynikowego odcisku, a nie rozmiar bloku czy klucza prywatnego. [1] [4]
Pełniejszy obraz uzyskasz, czytając to hasło razem z Hash, Proof of Work, Block Header, Adres Bitcoin, Merkle Tree, Bitcoin. Do tego hasła prowadzą również odsyłacze z Hash, ASIC Miner, Hashrate, Nonce.