Populární témata
#
Bonk Eco continues to show strength amid $USELESS rally
#
Pump.fun to raise $1B token sale, traders speculating on airdrop
#
Boop.Fun leading the way with a new launchpad on Solana.
Myslíte si, že implementace nonce je jednoduchá? Zamyslete se znovu.
Ať už vytváříte onchain protokoly nebo offchain infrastrukturu, správná implementace nonce je jednou z nejsložitějších částí kryptografického zabezpečení.
Pojďme se podívat na to, proč je ochrana proti přehrání těžší, než se zdá 👇
2/ Nejprve si pochopme digitální podpisy. V kryptografii s veřejným klíčem (jako je BLS) máte soukromý klíč, který podepisuje zprávy, a veřejný klíč, který je ověřuje.
V Ethereu:
address = hodnota hash veřejného klíče
zpráva = hodnota hash transakce
podpis = 64 bajtů kryptografického důkazu
3/ Zde je problém: matematika ve většině kryptografických protokolů s veřejným klíčem neomezuje, kolikrát lze podpis ověřit proti stejné zprávě. Jakmile budete mít platný podpis, můžete jej přehrávat donekonečna. To otevírá dveře k opakovaným útokům.
4/ Zadejte nonce: "číslo použité jednou", které zabraňuje útokům opakovaného přehrávání. Když příjemce obdrží zprávu s hodnotou nonce, zkontroluje, zda byla tato hodnota nonce použita dříve. Pokud ano, → zamítnout. Transakce Ethereum používají tento vzor.
5/ Implementace nonce je však klamavě složitá. Klíčové požadavky:
- Nonce nesmí být NIKDY opakovaně použitelné (na tomto řetězci nebo jiných)
- Musí trvale zabránit útokům přehrání
- Potřebujete mechanismy pro zvládnutí růstu úložiště
- Musí být odolný vůči útokům typu front-running
6/ Naivní řešení: uložit všechny nonce do databáze navždy. To má dva hlavní problémy:
a) Neomezený růst úložiště (zejména pomocí spamových útoků)
b) Zranitelnost vůči front-running útokům
Problém (a) je snazší vyřešit než (b). Nejprve se vypořádejme s úložištěm...
7/ Nonce založené na časových razítkách řeší růst úložiště! Použijte časové razítko + dobu platnosti. Hodnoty Nonce starší než 5 minut se z databáze odstraní. Ale co souběžné zprávy ze stejného účtu? Sdílejí časové razítko. Řešení: časové razítko + random_bytes pro granulární jedinečnost.
8/ Běh vpředu je ošemetná část. Aktéři se zlými úmysly mohou zachytit platné podpisy, spustit je dopředu, aby označily hodnoty nonce jako použité, a poté se volání legitimního uživatele odmítne. To je problematické u dávkových operací, pokud jeden špatný podpis odmítne celou dávku. Pro offchain: použijte šifrování TLS! Nedovolte, aby žádný aktér se zlými úmysly nikdy neviděl nonce nebo podpis.
9/ Nezapomínejte na vytrvalost! Pokud je mezipaměť nonce pouze v paměti, mohou útočníci po restartování systému znovu přehrát staré mezipaměti nonce. Vždy zachovat stav nonce do trvalého úložiště a znovu načíst při spuštění. Mezipaměti pouze z paměti = okno chyby zabezpečení pro opakované přehrávání.
10/ Unikátní nonce na spotřebitele! Při vysílání pro více uživatelů by měl každý dostat jinou zprávu/podpis. V opačném případě jste zranitelní vůči útokům Man-in-the-Middle, kdy jeden příjemce přepošle zprávu a vydává se za původního odesílatele.
11/ Inkrementální nonce (jako Ethereum, nonce = prev nonce + 1) mají své místo, ale pozor! Vytvářejí obrovské výzvy pro offchain infrastrukturu: zprávy mimo provoz, problémy se synchronizací a složité scénáře obnovy. Používejte pouze v případě, že jste si jisti, že zprávy budou (nebo musí) přicházet v pořadí.
Shrnutí – kontrolní seznam implementace nonce:
✅ Použití hodnoty nonce k zabránění útokům přehrání
✅ Zachování stavu nonce napříč restarty
✅ Implementace mechanismů vypršení platnosti (časové razítko + vyčištění)
✅ Nastavení hodnoty nonce jako jedinečné pro každého příjemce
✅ Ochrana před front-running pomocí šifrovaných kanálů
✅ Vyhněte se přírůstkovým nonce, pokud není zaručeno pořadí
Bezpečnost je v detailech! 🛡️
4,05K
Top
Hodnocení
Oblíbené