Атака с расширением длины изменяет результат хеширования поэтому с большой вероятностью параметры сложности уже недействительны. Из этого $$ h = \operatorname{SHA-256}(a\mathbin\|b\mathbin\|pad1)$$ в этом*. $$ h'= \operatorname{SHA-256}(a\mathbin\|b\mathbin\| \text{pad1}\mathbin\|\text{appended_data} \mathbin\| \text{pad2})$$ Мы не ожидаем, что они будут равными, равенство является незначительным событием.
Конечно, злоумышленник может искать такое расширение (appended_data), которое имеет аналогичный параметр сложности.Однако у них не так много времени, так как один из клиентов уже нашел одноразовый номер, подходящий для параметра сложности, и он уже распространяется по сети.
Проверяющие получат $а$ и $b$ и результат хеша $ч'$ (ограниченный размер является ключевым здесь). Когда они вычисляют значение хеш-функции, они будут вычислять $h = \operatorname{SHA-256}(a\mathbin\|b)$ и они это увидят $ч \neq ч'$ и равенство является незначительным событием.
Даже если они имеют одинаковое хеш-значение или допустимый параметр сложности, правильно реализованный клиент увидит атаку.
Следовательно, при правильной реализации атака с увеличением длины не является проблемой. Однако не полагайтесь на реализации, поскольку они могут быть неверными, используйте двойной SHA-256, как это делал Биткойн. В качестве альтернативы используйте устойчивые к расширению длины хеш-функции, такие как SHA-512/256, BLAKE2/3, SHA3-256.
Имейте в виду, что POW требует много работы, поэтому выбор двойной SHA-256 был неплохой идеей когда началось проектирование биткойнов.
*Прокладки
$pad1$ это дополнение SHA-256, где кулак 1
добавляется как можно меньше 0
s так, чтобы при добавлении кодировки длины сообщение было кратно 512.
Злоумышленник с расширением длины должен использовать это заполнение, а затем добавить расширенное сообщение, тогда для этого потребуется дополнительное заполнение, поскольку $pad2$, тоже.