Az elliptic curve kriptográfia (ECC) a modern TLS-kapcsolatok alapja. A legtöbb HTTPS-kapcsolat ma már ECC-alapú titkosítást és aláírást használ — és pontosan ez az, ami a TLS-fingerprintelést is lehetővé teszi.
Mi az az elliptic curve?
Az elliptic curve egy matematikai görbe, amelynek egyenlete:
y² = x³ + ax + b (hol 4a³ + 27b² ≠ 0)
Ez a görbe olyan tulajdonságokkal rendelkezik, amelyek lehetővé teszik két pont összeadását és egy pont szorzását. Ezekből a műveletekből épülnek fel az ECC-algoritmusok.
A lényeg: egy elliptic curve pontjaival végzett műveletek számítási nehézsége a Discrete Logarithm Problem-ből ered — egy pontból és annak szorzatából nem lehet hatékonyan visszaszámolni a szorzót. Ez a tulajdonság teszi biztonságossá az ECC-t.
ECDHE (Elliptic Curve Diffie-Hellman Ephemeral)
Az ECDHE a Diffie-Hellman kulcscsere ECC-alapú, ideiglenes (ephemeral) változata.
Hogyan működik?
- Mindkét fél (kliens és szerver) generál egy ideiglenes elliptic curve kulcspárt
- A nyilvános kulcsokat elküldik egymásnak a TLS-kézfogás során
- Mindkét fél a saját privát kulcsával és a másik nyilvános kulcsával kiszámolja a közös titkot
- Ebből a közös titokból származtatják a tényleges titkosító kulcsokat
- A privát kulcsok azonnal törlődnek — ez az „ephemeral" jelző
Miért fontos?
- Forward secrecy (előremenő titoktartás): mivel a kulcsok ideiglenesek, egy későbbi privát kulcs kiszivárgása nem teszi lehetővé a korábbi forgalom visszafejtését
- Teljesítmény: az ECC kisebb kulcsméreteket igényel ugyanolyan biztonsági szint mellett (pl. 256 bites ECC ≈ 3072 bites RSA)
- TLS-fingerprintelés: a kliens a ClientHello-ban elküldi a támogatott elliptic curve-okat (supported groups) és pontformátumokat — ezek egyediek böngészőnként és csomagonként
Példa egy ClientHello-ból
supported_groups: x25519(29), secp256r1(23), secp384r1(24)
ec_point_formats: uncompressed(0)
x25519 — a leggyakoribb modern curve, gyors és biztonságos
secp256r1 (NIST P-256) — klasszikus NIST curve
secp384r1 (NIST P-384) — nagyobb biztonsági szint
ECDSA (Elliptic Curve Digital Signature Algorithm)
Az ECDSA az ECC-alapú digitális aláírási algoritmus — a TLS-ben a szerver ezzel írja alá a tanúsítványát.
Hogyan működik?
- A szerver rendelkezik egy privát kulccsal és egy hozzá tartozó nyilvános kulccsal
- Amikor tanúsítványt küld, a nyilvános kulcsot és az ECDSA aláírást is elküldi
- A kliens a CA (Certificate Authority) nyilvános kulcsával ellenőrzi az aláírást
- Ha érvényes, megbízhat benne, hogy a szerver valóban az, akinek mondja magát
Miért jobb, mint a RSA-aláírás?
- Kisebb méret: egy ECDSA-P256 aláírás 64 bájt, míg egy RSA-2048 aláírás 256 bájt
- Gyorsabb generálás és ellenőrzés
- Kisebb tanúsítványok: kevesebb sávszélesség a TLS-kézfogás során
Kapcsolat a TLS-fingerprinteléssel
Amikor a Python kliensed HTTPS-kapcsolatot nyit, a ClientHello-ban elküldött titkosítók, kiterjesztések és elliptic curve paraméterek együttese egyedi ujjlenyomot alkot. A szerver (vagy egy botvédelmi rendszer, mint a DataDome) ezt összehasonlítja a böngészőkre jellemző mintákkal:
- OpenSSL (Python): széles legacy-cipherlista, GREASE nélkül, klasszikus kiterjesztés-sorrend
- BoringSSL (Chrome): GREASE-értékekkel kezdődik, modern kiterjesztések (ECH, ALPS), x25519 elsőként
- curl_cffi (impersonation): pontosan azt a ClientHello-t küldi, mint a célböngésző — a TLS-ujjlenyomat megegyezik
Ezért nem elég a HTTP-fejlécek másolása: a TLS-réteg önállóan is leleplezi a botot.
Összefoglaló
| Komponens |
Szerep a TLS-ben |
Fingerprintelési jelentőség |
| ECDHE |
Kulcscsere, forward secrecy |
A támogatott curve-ok listája egyedi ujjlenyomot ad |
| ECDSA |
Szerver tanúsítvány aláírása |
Nem közvetlenül fingerprintelhető, de a választott curve a ServerHello-ban szerepel |
| Elliptic curve-ok |
Matematikai alap |
A supported_groups és ec_point_formats mezők egyediek |
Hivatkozások