Atacul de extensie de lungime modifică rezultatul hash prin urmare cu mare probabilitate parametrii de dificultate nu mai sunt valabili. Din această $$ h = \operatorname{SHA-256}(a\mathbin\|b\mathbin\|pad1)$$ în asta*. $$ h'= \operatorname{SHA-256}(a\mathbin\|b\mathbin\| \text{pad1}\mathbin\|\text{apended_data} \mathbin\| \text{pad2})$$ Nu ne așteptăm să fie egali, egalitatea este un eveniment neglijabil.
Desigur, atacatorul poate căuta o astfel de extensie (appended_data) care are un parametru de dificultate similar.Totuși, ei nu au prea mult timp la dispoziție din moment ce unul dintre clienți a găsit deja nonce care este valabil pentru parametrul de dificultate și deja se propagă în rețea.
Verificatorii vor primi $a$ și $b$ și rezultatul hash $h'$ (dimensiunea limitată este cheia aici). Când vor calcula valoarea hash, o vor calcula $h = \operatorname{SHA-256}(a\mathbin\|b)$ și ei vor vedea asta $h \neq h'$ iar egalitatea este un eveniment neglijabil.
Chiar și au aceeași valoare hash sau parametru de dificultate valid, un client implementat corespunzător va vedea atacul.
Prin urmare, cu implementări adecvate, un atac de extensie de lungime nu este o problemă. Cu toate acestea, nu vă bazați pe implementări, deoarece acestea pot fi incorecte, utilizați SHA-256 dublu așa cum a făcut Bitcoin. Ca alternativă, utilizați funcții hash rezistente la extensia de lungime, cum ar fi SHA-512/256, BLAKE2/3, SHA3-256.
Rețineți că POW este conceput pentru a necesita multă muncă, așa că alegeți SHA-256 dublu nu a fost o idee rea când a început designul Bitcoin.
*Umpluturile
$pad1$ este umplutura lui SHA-256 unde pumnul 1
este atașat cât mai mic posibil 0
este astfel încât, atunci când se adaugă codificarea lungimii, mesajul este multiplu de 512.
Atacatorul cu extensia de lungime trebuie să folosească această umplutură și apoi să adauge mesajul extins, apoi va avea nevoie de o umplutură suplimentară ca $pad2$, de asemenea.