Portál AbcLinuxu, 30. dubna 2025 11:31
#ifndef JardikSSL_h_from_JardikuvNSAProofToolkit #define JardikSSL_h_from_JardikuvNSAProofToolkit enum JardikSSL_ERR { JARDIK_SSL_ERR_OK, JARDIK_SSL_ERR_SSL_NOT_SECURE }; enum JardikSSL_CTXTYPE { JARDIK_SSL_CTX_CLIENT, JARDIK_SSL_CTX_SERVER }; struct JardikSSL_CTX; struct JardikSSL_CERT; static inline enum JardikSSL_ERR JardikSSL_CreateContext(struct JardikSSL_CTX **ctx_out, enum JardikSSL_CTXTYPE ctx_type, int socket_fd, struct JardikSSL_CERT *cert) { return JARDIK_SSL_ERR_SSL_NOT_SECURE; } #endif
Tiskni
Sdílej:
$ gcc JardikSSL.c JardikSSL.c:16:1: error: expected ‘;’, identifier or ‘(’ before ‘struct’ struct JardikSSL_CTX;^
$ g++ JardikSSL.cpp JardikSSL.c:16:8: error: multiple types in one declaration struct JardikSSL_CTX;
$ javac JardikSSL.java JardikSSL.java:1: error: illegal character: \35 #ifndef JardikSSL_h_from_JardikuvNSAProofToolkit ^ JardikSSL.java:2: error: illegal character: \35 #define JardikSSL_h_from_JardikuvNSAProofToolkit ^ JardikSSL.java:16: error: class, interface, or enum expected struct JardikSSL_CTX; ^ JardikSSL.java:17: error: class, interface, or enum expected struct JardikSSL_CERT; ^ JardikSSL.java:19: error: class, interface, or enum expected static inline enum JardikSSL_ERR ^ JardikSSL.java:19: error: '{' expected static inline enum JardikSSL_ERR ^ JardikSSL.java:20: error: ')' expected JardikSSL_CreateContext(struct JardikSSL_CTX **ctx_out, ^ JardikSSL.java:20: error: ',', '}', or ';' expected JardikSSL_CreateContext(struct JardikSSL_CTX **ctx_out, ^ JardikSSL.java:20: error: '}' expected JardikSSL_CreateContext(struct JardikSSL_CTX **ctx_out, ^ JardikSSL.java:21: error: '{' expected enum JardikSSL_CTXTYPE ctx_type, ^ JardikSSL.java:21: error: <identifier> expected enum JardikSSL_CTXTYPE ctx_type, ^ JardikSSL.java:22: error: ',', '}', or ';' expected int socket_fd, ^ JardikSSL.java:22: error: '}' expected int socket_fd, ^ JardikSSL.java:26: error: class, interface, or enum expected } ^ JardikSSL.java:28: error: illegal character: \35 #endif ^ 15 errors
jardik
je bezpečný. Každý požadavek je zašifrován funkcí f(x) = 1 xor tmp
. Počáteční hodnota tmp
je 1. Takový obsah je pak nemožné při cestě rozšifrovat ani nejmodernějšími technologiemi NSA, odolný vůči standardním* MITM útokům a odolný dokonce i vůči hloupému příjemci zprávy. Ten ji může rozšifrovat jen se znalostí původní zprávy!
Tohle nebyla chyba protokolu.
Může pomoci použít dvouúrovňové zabezpečení založené na dvou různých protokolech a dvou různých šifrách. Třeba SSL + SSH. Buď tunel, VPN, IPSEC… a nad tím ještě šifrování v aplikaci (ve které ideálně přenášíš zprávy šifrované end-to-end zase jinou technologií – např. GnuPG).
Případně ta jedna úroveň nemusí být šifrování, ale aspoň něco jako port-knocking nebo SCRAM, ke kterému musíš znát heslo, abys měl vůbec šanci se připojit k tomu SSL/SSH. A taky nějaký IDS/IPS systém.
Tohle nebyla chyba protokolu.Vím. A myslím, že Jardík má hlavně problém s tím, že existují CA - ale to se SSL nemá nic společného.
Jardík má hlavně problém s tím, že existují CAAno, to je pravda. Viz níže
Chyba je hlavně v tom, že některé prohlížeče či jiné balíčky, či operační systémy, s sebou tahají jakýsi "důvěryhodný seznam" certifikačních autorit, jímž je ve výchozím nastavení důvěřováno. Tato volba důvěry by měla zůstat na uživateli. Pokud už s sebou ten seznam tahají, měli by být všechny nastaveny jako nedůvěryhodné, dokud uživatel neurčí jinak.
To je sice hezké, ale uživatelé toho většinou nejsou schopní, takže jak to pak dopadne? Všechno bude nedůvěryhodné. Ale uživatel se k těm službám potřebuje připojit, takže to odklikne cokoli, jen aby se dostal na svůj Facebook, do své banky, na e-mail atd.
Bezpečné spojení pak pro BFU bude vypadat úplně stejně, jako spojení, na které dělá MITM jeho zlomyslný soused, správce sítě, ISP, tajná služba atd. Proto tu jsou výchozí CA, které umožňují alespoň části těchto útoků předejít.
Samozřejmě jim nelze slepě věřit a je vhodné to doplnit o další úroveň zabezpečení – např. by mohly být CA důvěryhodné systémově a pak důvěryhodnější ty. které si označil uživatel (zobrazovala by se jiná ikonka). Navíc by se měla kontrolovat změna certifikátu/klíče oproti minulému spojení a uživatel by měl být varován (to umí některé doplňky do prohlížečů). Případně to lze všechno podepsat ještě jinou CA – tím myslím DNSSEC/TLSA, což je sice špatné v tom, že je to monopolní systém, ale pro kontrolu to použít lze (jako pojistka, dvojitá kontrola). Také by šlo kontrolovat z více míst v Internetu, z různých sítí, zda server používá stejný certifikát – na to jsou opět doplňky do prohlížečů. Dále lze použít WOT a nechat uživatele podepisovat certifikáty jako je tomu v PGP.
Nakonec to vede na celou škálu úrovní důvěryhodnosti spojení, nikoli jen binární informaci důvěryhodný/nedůvěryhodný.
Navíc by se měla kontrolovat změna certifikátu/klíče oproti minulému spojení a uživatel by měl být varován (to umí některé doplňky do prohlížečů)Jaké? Nedávno mi někdo doporučoval CA Patrol, jenže ten nefunguje "správně", protože nezabrání spojení a odeslání dat, pouze mi vykydne varování, ale to už je pozdě. viz tu.
jj, to mi taky vadí, že sice zařve, ale kdyby se v tu chvíli odesílala nějaká důvěrná data1, tak je už pozdě.
Tyhle chyby se dají řešit, ale bez toho předschváleného seznamu důvěryhodných CA se BFU stejně asi neobejde – jak jsem psal, jsou různé kategorie útoků a je dobré ochránit uživatele alespoň před některými z nich, než to hodit všechno do jednoho pytle i s důvěryhodnými spojeními a tvářit se, že je všechno nedůvěryhodné, dokud si uživatel ručně nezkontroluje otisk klíče (protože většina uživatelů se na to bohužel vykašle).
[1] POST, HTTP autentizace nebo vlastně i cookies
Vždyť o tom píšu:
Také by šlo kontrolovat z více míst v Internetu, z různých sítí, zda server používá stejný certifikát – na to jsou opět doplňky do prohlížečů.
Jenže zkus se nad tím zamyslet. Znamená to, že pak věříš notářským serverům provozovaných nějakou jednou organizací nebo v rámci nějaké jedné infrastruktury. Tudíž vlastně jedné CA. A jak se do prohlížeče dostane seznam důvěryhodných notářských serverů? A jak zajistíš bezpečnou komunikaci s nimi? Asi by to chtělo šifrovat a podepisovat ten kanál, po kterém se ty informace posílají. Jak to budeš šifrovat? Kde na klientovi vezmeš certifikáty či veřejné klíče druhé strany (notáře), abys ji ověřil? Co budeš dělat, až dojde k vypršení nebo kompromitaci nějakého klíče notářského serveru a bude potřeba ho revokovat a vydat nový? Jak tuhle informaci dostaneš na klienty? Je to podobná situace jako u DNSSEC/TLSA – stále řešíš tu samou otázku (jak dostat nějaké veřejné klíče bezpečně na klienty) a navíc je to centralizovaný systém, nad kterým bdí jedna autorita (buď hierarchie DNS s jedním kořenem nebo nějací provozovatelé sítě notářských serverů). Navíc u těch notářských serverů je problém v tom, když se záškodník dohodne s datacentrem, kde je server, nebo jeho ISP a budou dělat MITM tam – pak všichni, včetně všech notářských serverů, uvidí stejný certifikát.
Řešení vidím v kombinaci více prostředků, několikanásobné ochraně a kontrole. Což tedy vede na nebinární hodnocení důvěryhodnosti (ne jen ano/ne, ale celá škála), se kterým se uživatel musí nějak vyrovnat a nějak ho vyhodnotit… což se asi uživatelé budou muset naučit nebo tu bude muset být nějaké rozumné výchozí nastavení. Ale každopádně plnohodnotná náhrada k systému PKI/CA v současnosti neexistuje.
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.