Autor Zpráva
Marti_n
Profil
Ahojte,

keď si spravím algoritmus na strane servera na zašifrovanie textu, dá sa aj tak odchytiť ten text pred tým ako sa zašifruje treťou stranou? Ak hej, treba to šifrovať ešte u klienta?

Ďakujem.
juriad
Profil
Takže ty máš server, který zašifruje data, která dostane a něco s nimi udělá (to pro nás není zajímavé).
Data odesílá klient skrze webový prohlížeč tvému skriptu.

Samozřejmě, že je může někdo po cestě od klienta na tvůj server odchytit, pokud přenos není šifrovaný. K tomu slouží https (šifrování HTTP pomocí SSL).
Marti_n
Profil
juriad:
Zoberme si príklad. Užívateľ pošle správu, dáta sa odošlú cez https a na serveri sa zašifrujú do databázy.
Vie niekto získať prístup k pôvodnej správe? Teda myslím cez ten prenos na server.
Tomáš123
Profil
Marti_n:
Vie niekto získať prístup k pôvodnej správe?
Áno. Ak sa užívateľ pripája cez nezabezpečené wifi, môže poskytovateľ dáta i zneužiť.
juriad
Profil
To záleží na odolnosti toho https. Spíš to možné není. Ale existují útoky na SSL (heart bleed) a existují útoky na připojení (man in the middle). Pak záleží na tom, zda uživatel jen tak odklepne varovnou hlášku v prohlížeči. A existují i útoky na klienta (nahrání vlastního kořenového certifikátu spojené často se zavirováním počítače - pak se o MITM nedozví). Občas se stane něco i „omylem“, viz nedávná kauza Lenovo.

Tomáš123:
Není pravda. SSL tě před nezabezpečenou wifi ochrání. Tam jen hrozí ten MITM útok.
Marti_n
Profil
Tomáš123:
Takže je dobré šifrovať ešte u klienta?
Tomáš123
Profil
juriad:
SSL tě před nezabezpečenou wifi ochrání.
Áno, ale ja som hovoril o nezabezpečenom protokole HTTP.

Marti_n:
Ako by si si také šifrovanie predstavoval? Teoreticky je šifrovanie u klienta ešte nebezpečnejšie. juriad ti v tomto poradí lepšie.
juriad
Profil
Tomáš123:
Aha, já myslel, že dplňuješ mou výpověď o SSL.
Marti_n
Profil
Šifrovať už v javascripte je asi blbosť, pretože klient má k nemu prístup, ibaže by sa to dalo nejako skryť.
Juraj Hajdúch
Profil
Marti_n:
Tomáš123:
Takže je dobré šifrovať ešte u klienta?

Je možné napríklad implementovať algoritmus AES256 formou javascriptu na strane klienta a dáta posielať na server už zašifrované (asynchrónne, verejný/privátny kľúč). Více napr. na crypto-js. Pre bežné potreby a správne použitý je tento algoritmus nateraz dostatočne silný, bezpečný.
Keeehi
Profil
Marti_n:
Šifrovať už v javascripte je asi blbosť, pretože klient má k nemu prístup, ibaže by sa to dalo nejako skryť.
Uložiště mega to takto dělá. Soubory šifruje v prohlížeči a na server se posílají už zašifrovaná data. Klíč se vyskytuje jen v prohlížeči u uživatele, takže ani na serveru není možné data rozšifrovat.

Šifrovat se dá na spoustě úrovní. Spíš nám řekni, čeho bys chtěl dosáhnout, nebo čeho se bojíš.
Marti_n
Profil
Chcel by som si vyskúšať spraviť šifrovaný chat. Najprv ma napadla jedna vec, šifrovať už na strane klienta a nejak tú funkciu v javascripte schovať aby k nej nemal nikto prístup, ale to asi nie je možné :)
Tomáš123
Profil
Marti_n:
Možno by stálo za spomenutie vytvoriť vlastný šifrovací algoritmus, zakódovať ním správu, na strane servera rozlúštiť, zašifrovať do nejakého z predvolených šifrovaní a uložiť. To je ale iba možnosť, kde by pre neposlušného užívateľa rozlúštenie šifrovania nič neznamenalo. Vytvoriť vlastné šifrovanie ale nie je len tak.
Marti_n
Profil
Tomáš123:
No samotný užívateľ, ktorý odosiela správu, tak keď to rozlúšti, tak to nevadí, ale tu je problém, že by vedel rozlúštiť dalšie správy, teda možno by sa ten šifrovací algoritmus mal podľa niečoho správať čo má daný klient jedinečné.
Juraj Hajdúch
Profil
Marti_n:
...nejak tú funkciu v javascripte schovať aby k nej nemal nikto prístup, ale to asi nie je možné :)

v podstate nie... môžete to maximálne niekomu sťažiť, ale uvedomte si, že dobre napísaný šifrovací algoritmus môže byť kľudne verejný a aj by mal byť. Rozhodne, pokiaľ nie ste na slovo vzatý odborník na kryptografiu/programovanie/matematiku, sa do programovania žiadneho šifrovacieho algoritmu nepúšťajte, teda takého, ktorý by ste chceli nasadiť do ostrej prevádzky. :o)


Marti_n:
teda možno by sa ten šifrovací algoritmus mal podľa niečoho správať čo má daný klient jedinečné.

...žeby podľa klientom definovaného kľúča (hesla)?
Joker
Profil
Marti_n:

Doplním k tomu HTTPS, že to by mělo zajistit odolnost vůči odposlechu na trase, ale neochrání před odposlechem na straně serveru, tj. pokud by si někdo někam vypsal hodnotu nějaké proměnné, nebo sledoval obsah paměti. Proti tomu by šifrování na straně klienta fungovalo.
Neochrání ani proti odposlechu na straně klienta (třeba snímání stisknutých kláves), ale to na straně webové aplikace asi rozumně řešit nejde.

Šifrovať už v javascripte je asi blbosť, pretože klient má k nemu prístup, ibaže by sa to dalo nejako skryť.
Proč?
Dobře navrženému šifrovacímu systému nevadí, že potenciální útočník zná algoritmus šifrování.

tu je problém, že by vedel rozlúštiť dalšie správy, teda možno by sa ten šifrovací algoritmus mal podľa niečoho správať čo má daný klient jedinečné.
Ano, každý klient by musel mít svůj privátní klíč.
Keeehi
Profil
Juraj Hajdúch:
asynchrónne, verejný/privátny kľúč
Máš určitě na mysli asymetrický.

Marti_n:
Najprv ma napadla jedna vec, šifrovať už na strane klienta a nejak tú funkciu v javascripte schovať aby k nej nemal nikto prístup, ale to asi nie je možné :)
Ano, javascript není možné schovat. Ovšem dobrá zpráva je, že to není potřeba. Pokud nechceš tvořit vlastní šifrovací funkci (což rozhodně nedělej, protože nemáš šanci to vytvořit správně) tak ty co existují jsou navržené tak, aby jejich kód mohl být veřejný. A on taky je. Přesto že podrobně známe algoritmus kterým se šifruje, nejsme schopni ji rozlušit bez znalosti klíče.

Takovýto chat jde vytvořit pomocí asymetrické šifry. Fungovalo by to tak, že bys v prohlížeči vygeneroval 2 klíče. Privátní si necháš (má tu vlastnost, že dokáže správu rozšifrovat) a veřejný pošleš protistraně. Veřejný klíč má tu vlastnost, že s jeho znalostí můžeš zašifrovat text tak, aby byl rozluštitelný privátním klíčem i když ho neznáš. Ovšem i když znám veřejný klíč, nejsem schopný zprávu dešifrovat. Jak to že to tak funguje? No je to tak navrženo, aby to tak fungovalo. Matematicky se využívá modulárního dělení a velkých prvočísel. Pokud tě zajímá více, tady jsou slidy z přednášek ze ČVUTu.
Abych se vrátil. Protistraně pošleš veřejný klíč (když to odposlechne útočník, ničemu to nevadí). Ten na druhé straně vytvoří zprávu, zašifruje ji tím veřejným klíčem a zašifrovanou ji pošle zpátky. I když tuto zprávu útočník odposlechne, stále nemá šanci zjistit, co je v ní. Vy přijatou zprávu rozšifrujete soukromým klíčem. Jelikož ten nikdy neopustil váš počítač, nemohl se k němu útočník nijak dostat. Tudíž protistrana vám je schopna odesílat šifrované zprávy. Aby to byl chat, tak je to potřeba zdvojit a obrátit. Protistrana si vytvoří dva klíče, vám pošle ten veřejný a pomocí něho budete vy posílat šifrované zprávy protistraně.

Tudíž řeší to problém odposlouchávání zpráv. Pokud má ale útočník možnost zprávy i modifikovat, pak může provést útok MITM. Tomu se na http protokolu neubráníte. Proto byste měl použít https. Pokud budeme předpokládat, že se útočníkovi nepodaří prolomit https, ochrání vás proti MITM útoku. Navíc šifruje i tu komunikaci, takže ta zpráva bude 2x šifrovaná. Takže teď jde o to, jak moc velkou bezpečnost chcete použít.
1. Použijete https protokol a zprávy nebudete javascriptem šifrovat. Pro útočníka jsou zprávy nečitelné, ovšem na serveru se vyskytují v čitelné podobě.
2. Použijete https protokol a zprávy budete javascriptem šifrovat. Pro útočníka jsou zprávy nešitelné a i pro server jsou zprávy nečitelné.

Tudíž https protokol chrání před útoky a javascript přidává jen ochranu v případě, že bude server kompromitován (ať už úspěšným hackerským útokem nebo třeba kvůli nařízení ze strany státních orgánů). Je snad jasné, že jakmile je server kompromitován, může být veškerá následná komunikace také kompromitována. Rozdíl však bude u zpráv, které proběhly před kompromitací a jsou ještě na servru uložené. Pokud nebyly šifrované javascriptem, budou čitelné. Pokud šifrované byly i nadále zůstanou zašifrované.

Tomáš123:
Jak už jsem psal výše, vytvářet vlastní algoritmy není dobrý nápad. Aby byly opravdu bezpečné, pracuje se na jejich vývoji v laboratořích měsíce i roky a dělají na nich lidé s obrovskými znalostmi matematiky. A i přesto se stane, že udělají občas chybu. Není možné abys sám za odpoledne napsal vlastní šifrovací algoritmus, který by byl neprolomitelný.
Juraj Hajdúch
Profil
Keeehi:
Máš určitě na mysli asymetrický.

:o) Samozrejme, sorry... Dík za upozornenie.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: