Bitcoin-biztonság: digitális aláírások

2011-11-13

Szerző: Marco Holmer

Ahhoz, hogy jobban megérthessük a Bitcoin hamisíthatatlanságát és névtelenségi potenciálját, meg kell ismerkednünk a háttérben meghúzódó mechanizmusokkal. Ez a cikk a Bitcoin kulcstechnikáját és az azzal kapcsolatos fogalmakat mutatja be. Ennek leglényegesebb része az ún. aláírás. Ez annyit tesz, hogy egy dokumentumot (illetve a Bitcoin esetében az üzeneteket, vagyis minden egyes tranzakciót) egy olyan adatsorral “írunk alá”, amely csak és kizárólag a dokumentum tulajdonosától származhat. Rajta kívül éppúgy nem tudja senki más előállítani ezt az adatsort (= ezt az aláírást), mint ahogyan a valóságban is csak te magad tudod teljes hitelességgel reprodukálni a saját aláírásodat. Ezáltal ellenőrizhető az egyes dokumentumok valódisága (= manipulálatlansága). Mivel a Bitcoin rendszere nem kódolja az üzenetközvetítéseit, ezért ezzel a módszerrel gondoskodik róla, hogy mégse piszkálhasson bele senki az üzenetekbe. Gyakorlati szempontból ez egy bizonyos aszimmetrikus kódolási eljárással működik. És hogy mit is jelent ez az aszimmetrikus kódolás? Rövidesen rátérünk arra is, de az érthetőség kedvéért induljunk az alapoktól, és haladjunk lépésről lépésre:

Szimmetrikus kódolás

Ez az a módszer, ami szinte mindenkinek elsőként eszébe jut a kódolásról: egy bizonyos recept, amellyel titkosírássá alakíthatjuk át az adatokat, és amelyből az üzenet címzettje aztán ugyanezen recept megfordításával fejtheti vissza az eredeti adatokat. De ehhez persze neki is ismernie kell a receptet, vagyis a közös “kulcsot”. Ezt a módszert azért nevezzük szimmetrikusnak, mert mind a feladó, mind pedig a címzett ugyanazt a kulcsot használja (ilyen például a ZIP-fájlok jelszavas védelme is). Egyszerű példája a szimmetrikus kódolásnak a következő recept: minden betűt cserélj ki az ábécében X hellyel hátrébb állóra. Itt tehát ennek az alapeljárásnak és az X értékének az ismerete jelenti a kulcsot. Ha például X = 2, akkor a következőképp áll a helyzet:

a b c d e f g h i j k l m n o p q r s t u v w x y z (eredeti)
y z a b c d e f g h i j k l m n o p q r s t u v w x (titkosított)
Így lesz a “Hello World”-ből “Jgnnq Yqtnf”.

Ennek az eljárásnak a gyenge pontja az, hogy valamiképp a titkos kulcsot is el kell juttatni a feladótól a címzetthez, például egy előzetes négyszemközti megbeszélés során. Ennek hiányában nem lehetséges a biztonságos kódolás. Biztonságos csatorna nélkül nem lehetséges az egymás előtt előzőleg ismeretlen felek közti tetszőleges kódolás – márpedig a netes fizetések legnagyobb része pontosan ilyen körülmények között zajlik.

Aszimmetrikus kódolás

Kulcspár: a titkos és a nyilvános kulcs.

A nyilvános kulcsok szabadon szétoszthatóak.

Az aszimmetrikus (avagy nyilvános kulcsú) kódolás már egy fokkal ravaszabb, és orvosolja a szimmetrikus kódolás hiányosságait. Itt két összefüggő kulcsot, ún. kulcspárt használunk: egy titkos és egy nyilvános kulcsot. Az utóbbit bárki láthatja és ismerheti, szabadon küldhető mailben, terjeszthető a neten, kétes biztonságú csatornákon keresztül is. A feladó az üzenetét a címzett nyilvános kulcsával kódolja le, így aztán azt csak az ahhoz tartozó, megfelelő titkos kulccsal lehet kinyitni. Más szóval, a kódolást követően már csak és kizárólag a titkos kulcsot birtokló címzett tudja dekódolni az üzenetet, és rajta kívül, a kulcs hiányában senki más.

Ennek az eljárásnak a legfőbb előnye az, hogy nem igényel előzetes megbeszélést vagy más plusz információcserét a feladó és a címzett között; nincs többé szükség közös titkokra.

Aláírás

Hasonló a helyzet az aláírás esetében is, csak ezzel nem az üzenet tartalmát védjük az illetéktelenektől, hanem annak az eredetiségét hitelesítjük, tanúsítva, hogy az valóban a feladatótól származik, és hogy senki nem is piszkált bele útközben. Ezt úgy oldjuk meg, hogy a feladó a saját titkos kulcsával kódolja le az üzenetet; ez esetben a dekódoláshoz is az ő nyilvános kulcsára lesz szükség. Amennyiben értelmes üzenetet kapunk eredményül, úgy biztosak lehetünk benne, hogy az valóban eredeti és módosítatlan, mivel csak a feladó rendelkezik a saját nyilvános kulcsával, így az üzenetet is csak ő kódolhatta le.

Megjegyzés:A kódolás és az aláírás együtt is alkalmazható.

Digitális aláírások a gyakorlatban, hashelés

A digitális aláírások alkalmaznak még egy további, az automatikus ellenőrzést lehetővé tevő eljárást is. Ennek keretében a feladó egy ismert eljárás szerint kiszámol az üzenetből egy bizonyos számot, az úgynevezett hash-értéket (ejtsd: hess). A hashfunkciók mindig egyirányúak, vagyis minden bemeneti adathoz hozzárendelnek egy bizonyos értéket, de ebből az értékből már nem lehet visszafejteni az eredeti adatot, és következtetni sem lehet arra semmilyen formában. Hash-funkcióként szolgálhat például az is, ha egyszerűen összeadjuk a számok számjegyeit:

Üzenet Üzenet hash-értéke
123         6
1234      10
926        17
1637      17

Minden “üzenethez” hozzárendelünk tehát egy pontosan meghatározott hash-értéket, amiből azonban sehogyan sem tudjuk rekonstruálni az eredeti üzenetet. Visszatérve ismét az aláírásra: a feladó kiszámítja az üzenete hash-értékét, majd kódolja az üzenetet a titkos kulcsával. Ennek az eredménye az aláírás, amit ugyanúgy hozzáfűzhetünk az üzenethez, ahogy a kézírásos aláírásunkat is a különböző nyomtatványokhoz. Így mostantól bárki ellenőrizheti az eredetiségét a következő eljárással: dekódolja az aláírást a feladó nyilvános kulcsával, majd az így kapott, a feladó által kiszámított hash-értéket összeveti összeveti az üzenetből a saját maga által újra kiszámított hash-értékkel. Ha a kettő megegyezik, akkor a címzett biztos lehet benne, hogy senki nem változtatta meg az üzenetet, és hogy az valóban a feladótól is származik.

Egy Bitcoin-üzenet mintája aláírással:

A átutal B-nek 100 bitcoint.
++++++++ aláírás +++++++++
34mb72m3nv237364bv7846b8
fz6fg56hgk05hdkgfh18hk15
+++++++++++++++++++++++

Ennek az eljárásnak a biztonságossága kizárólag a hashfunkció függvénye. Ez az előző, fentebbi példatáblázat utolsó két sorából válhat különösen nyilvánvalóvá, ahol is láthattuk, hogy a funkció két, egyébként eltérő üzenethez is ugyanazt a hash-értéket rendelte hozzá. Ezt – amikor két különböző bemeneti adat ugyanazt a hash-értéket eredményezi – hash-ütközésnek nevezzük. Egy esetleges támadó ennek a kiaknázásával meghamisíthatná az üzenetet, és a példa szerint máris kicserélhetne 926 bitcoint 1637-re, mivel a kettőnek ugyanaz lenne a hash-értéke. Nem is panaszkodna emiatt senki, mert ránézésre minden tökéletesen rendben lenne, és továbbra is úgy tűnne, mintha az üzenet aláírása valóban érvényes lenne és valóban a feladótól származna. Szerencsére azonban a valódi hashfunkciók gyakorlatilag lehetetlenné teszik a hash-ütközéseket.

Ezek esetében ugyanis még az is valószínűbb, hogy az ember többször egymás után nyerjen a hatos lottón, mint az, hogy hash-ütközésbe botoljon – vagyis majdhogynem lehetetlen egy másik olyan üzenetet találni, ami pontosan ugyanazt a hash-értéket eredményezi. (Hat találat esélye a hatos lottón: 1:13.983.816 (8 számjegy), hash-ütközés esélye az SHA-256-os hashfunkciónál: 1:1,16 x 10^77 ^(77(!) számjegy.) Az pedig már valóban az abszolút lehetetlenséggel határos, hogy ez az esetleges második, azonos hash-értéket eredményező üzenet szintén értelmes is legyen, és még pont meg is feleljen a támadó céljainak. Példaként vegyük szemügyre a következő üzeneteket és a hozzájuk tartozó, a Bitcoin által is alkalmazott SHA-256-os funkcióval előállított hexadecimális hash-értékeket. Jól láthatjuk, hogy az üzenet legcsekélyebb változása is gyökeresen eltérő értékeket eredményez:

“szabadpénz” | 61ea5be0557d284d7ed3a81d81405e44f9076f130cc2cbb01d987d05b3289792
“szabad pénz” | a4cb8f0b02106b2f995d09a0dae7d0c408cda5c126485854990b132517452716
“szabod pénz” | dc6c87364eb036f0672753817a899761796525d91d6b01d9618f2a3cb0b6cada
“szobad pénz” | 52ae49034a33b495aa6bcad107921328671469630c3fcf35e50e796fd135e65f

Bitcoin-trükkök:

A fokozott biztonság érdekében a Bitcoin kétszeres hashelést alkalmaz, vagyis az első hash-értékből generál egy újabb hash-értéket. A Bitcoin az ún. “Elliptikus Görbe Kriptográfia” (ECC – szintén aszimmetrikus) rendszerét használja. Ezzel az eljárással már rövid kulcsokkal is garantálható a teljes biztonság. A Bitcoin 160 bit hosszú nyilvános kulcsokat használ, és ezzel ugyanazt a biztonsági fokot nyújtja, mint amit az ismert RSA algoritmus csak 1024 bittel tud nyújtani. Összehasonlításképp: a például az online bankolásnál is rutinszerűen alkalmazott HTTPS protokoll SSL-kódolása 128 bites RSA-t használ.

A Bitcoin-címek tehát nyilvános kulcsok. A hozzájuk tartozó nyilvános kulcsokat a wallet.dat fájlban tárolja el a kliens. A Bitcoin-címeket egy egyéni, az úgynevezett Base58-as kódolás alapján generálja a rendszer. Ennek célja egyebek mellett az, hogy biztosítsa a kulcsok írott formájának olvashatóságát, és hogy valóban csak ki is nyomtatható ASCII-karakterekre képezze le azokat. Szándékosan elhagyták emellett az ismert Base64-es kódolás szabványából az írásjeleket is, hogy a jelsorozatra való duplakattintással valóban az egész sor kijelölésre kerüljön, megkönnyítve így a gyakran alkalmazott másolás és beillesztés folyamatát is. Kihagyták továbbá az olyan jeleket is, amelyek kézi legépelés esetén egymással összetéveszthetőek lennének, így például a nullát (0) és a nagy “O”-t, vagy épp az egyest (1) és a kis “l”-t.

Forrás: Go-Bitcoin.com

A lap szövege Creative Commons Nevezd meg! – Ne add el! – Így add tovább! 3.0 licenc alatt áll, felhasználni csak forrásmegjelöléssel, és ide mutató linkkel szabad.