Diskrétní sdílení textů

Uživatelé občas potřebují sdílet texty s ostatními (nebo si je jen uložit pro sebe) a ne každý si kvůli tomu chce hned pořizovat vlastní server nebo web či blog. Proto existují různé „pastebin“ služby – člověk jednoduše vloží svůj text do formuláře, odešle a obdrží URL, na kterém bude jeho text přístupný.

Zerobin

Problém

Většina těchto služeb funguje tak, že její provozovatel si může dané texty číst. Jedna stará dobrá bezpečnostní poučka říká, že každý by měl mít jen taková práva, jaká nezbytně nutně potřebuje ke své činnosti.

Poskytovatel ale naše texty číst nepotřebuje. My od něj chceme pouze trochu diskového prostoru (pro texty stačí málo) a adresní prostor (URL), ve kterém budou texty přístupné.

Řešení

Řešením je šifrování – pokud by provozovateli někdo ukradl/zabavil disky, nic si z nich nepřečte. Šifrování ale bohužel hodně běžných uživatelů nerozumí, přijde jim nepohodlné a nevědí, jak si vyměňovat klíče. Takže často nešifrují.

V následujícím textu se podíváme na jedno elegantní řešení, které je pohodlné a „blbuvzdorné“ a zároveň relativně bezpečné.

Jak to funguje

Naším cílem tedy je zašifrovat vkládaný text ještě na straně uživatele (JavaScriptem v prohlížeči) a odeslat na server. Čtenáři si daný text budou stahovat šifrovaný a k dešifrování dojde opět až v jejich prohlížeči.

Jediné, co zbývá, je zajistit přenos šifrovacího klíče od autora textu ke čtenářům. K tomu využijeme vlastností URL a HTTP protokolu.

URL může obsahovat tzv. fragmentový identifikátor:

http://www.example.com/index.xhtml#identifikator

Ten se běžně používá k odkázání na určitou část stránky – např. máme dlouhý článek a můžeme chtít odkázat na jednu kapitolu uprostřed stránky (příslušnému nadpisu nastavíme XML atribut id="něco" a pak odkazujeme na #něco).

Pro nás jsou důležité dvě vlastnosti:

  • identifikátor se neposílá v rámci HTTP požadavku na server (ten ho k ničemu nepotřebuje, důležitý je jen pro klienta)
  • identifikátor je přístupný z JavaScriptu – takže když někomu pošleme odkaz s identifikátorem, skript na dané stránce si ho může přečíst a dále s ním pracovat

Identifikátor za # v URL tudíž můžeme použít k předání klíče – URL vložíme třeba do nějaké diskuse, mikroblogu, pošleme e-mailem nebo předáme třeba na papírku. Příjemce ho zadá do prohlížeče, ze serveru mu přijde šifrovaný text a v prohlížeči se dešifruje.

K dešifrovanému textu se nedostane ani provozovatel služby, ani různé proxy servery nebo MITM útočnici po cestě. Pokud si někdo bude číst logy, najde v nich jen URL bez #šifrovacíhoKlíče, a nebude si tak publikovaný text moci přečíst.

Utajení textu stojí na utajení odkazu (obsahujícího klíč). Nicméně i když odkazy nebudou tajné (např. se budou vyskytovat ve veřejně přístupných diskusních fórech), má útočník značně ztíženou práci, protože musí nejdříve posbírat odkazy a pak dešifrovat texty – nestačí si jednoduše přečíst/prohledat databázi na serveru poskytovatele „pastebin“ služby.

ZeroBin

Jednou implementací výše popsaného principu je ZeroBin – jednoduchá aplikace napsaná v jazyce PHP, svobodný software (zdrojové kódy).

Zajímavé vlastnosti:

  • používá 256 bitovou AES šifru
  • má minimální závislosti (PHP 5.2.6 a vyšší + GD) a nepotřebuje ani databázi – používá soubory
  • u vkládaných textů lze povolit diskusi – komentáře se také šifrují
  • diskutující můžou přispívat anonymně, nebo se podepsal libovolnou přezdívkou – pak se u nich zobrazuje avatar vygenerovaný na základě jejich IP adresy (tzv. vizuální hash, který by nemělo jít přeložit zpět na IP adresu)

Aplikace je zatím velmi mladá, autor ji označuje jako alfa-verzi, nicméně už teď vypadá použitelně.

Prostor pro zlepšení

Jelikož se JavaScript stahuje ze serveru, musí mu uživatel důvěřovat. A pokud se nepoužívá HTTPS, musí důvěřovat i všem síťovým prvkům po cestě. Potenciální útočník by totiž mohl do prohlížeče poslat pozměněný JavaScript, který by se choval na první pohled stejně, ale data by před odesláním nešifroval, nebo je šifroval slabým či vždy stejným klíčem.

Uživatel si kód běžící v prohlížeči může zkontrolovat např. FireBugem, ale to není zrovna pohodlné a dělat to pokaždé je otrava a ztráta času.

Bylo by tedy dobré, kdyby existovala desktopová aplikace, které bude moci uživatel důvěřovat a která se postará o zašifrování a odeslání na server.

i1984.cz/paste

ZeroBin si můžete provozovat na vlastním serveru nebo využít nějakou jeho již existující instanci. Jednu jsme pro vás zprovoznili na adrese: https://i1984.cz/paste/

A takto vypadá vložený text: https://i1984.cz/paste/?6d3a7c43f4770e67#ZLqRePX5vM6KY…NDlKkWKIQ=

  • 6d3a7c43f4770e67 je identifikátor daného textu
  • ZLqRePX5vM6KYc8CmQXfb9aG9IisijNBYYNDlKkWKIQ= je šifrovací klíč

Pamatujte prosím, že software je v poměrně dost raném stádiu vývoje a není zaručeno, že služba na výše uvedené adrese tu bude navěky. Pokud byste v aplikaci našli chybu, nahlaste ji prosím nám i autorovi programu.

Komentáře

Ono by šlo dát klíč i za otazník...

Pokud nebudeme ověřovat chování skriptů a nebudeme mít offline app, která se nemůže jen tak změnit (a které bychom důvěřovali), nebyl by příliš rozdíl mezi používáním ?queryStringu a #hashe.

Pokud je spojení zabezpečené, záleží na čestnosti a zabezpečení provozovatele. Pokud bude chtít, klíč si skriptem prostě pošle.

A pokud spojení není zabezpečené, hash nám taky moc nepomůže - pokud útočník pozmění komunikaci, může se k tomu také dostat.

lokální JS

No on by ten JS měl mít hlavně každý lokálně jako browser JavaScript, ne? Já bych to úplně oddělil na diskuzi/paste (serverová část) a ten šifrovací JS. Tu serverovou část bych vůbec neřešil a použil např. Pastebin.com. Upravil bych klientskou část, tzn. ten JS a použil ho u sebe jako browser JavaScript. A samozřejmě bych si ho upravil pro konkrétní stránku, kterou bych chtěl použít - tedy vyvolání na nějaké hezké JS eventy (asi onLoad pro decrypt a onClick na nějaký submit pro encrypt).

Takto to bude pro server naprosto transparentní a tím pádem mohu používat i nedůvěryhodný server. Nevýhoda je, že by bylo třeba ten JS tahat s sebou a příp. si ho na cizí počítač do browseru přidat.

Ale přijde mi to čistší řešení, než řešit i serverovou část. Myslím, že to na ní může být nezávislé a tím pádem půjde použít libovolnou existující službu (s veškerou její další funkcionalitou) a nevymýšlet kulatější kolo :)

Ano šlo ale...

Sice by šlo dát hash to query stringu. Má to ale několik dopadů: Při zaslání požadavku na server se posílá (zcela logicky) i query string a tím pádem server zná dešifrovací klíč. Také se bude pravděpodobně požadavek logovat a v logu bude tím pádem i dešifrovací klíč. Provozovatel serveru pak tedy má přístup k rozšifrovaným datům a může si je číst. A tím celá ta maškaráda okolo kolem šifrování ztrácí smysl. Tím, že je dešifrovací klíč za # se zajistí, že server jej nezná a nikdy jej nedostane přímo od browseru. Samozřejmě je možné napsat klientský Javascript tak, aby klíč posílal serveru, ale to je jiná věc. Celé je to o tom, že až někdo přijde za provozovatelem serveru, že je od tajných a myslí si, že jeho server je zneužíván k nelegálním věcem a bude požadovat data a logy, budou mu k ničemu a žádná data bez pořádného louskání tajnej nedostane. Ač mu provozovatel předá vše, co má. Je to vlastně taková ochrana tvého soukromí z vůle provozovatele služby.

Spam

Docela fajn na tom je, že takovým stránkám nebude rozumět ani vyhledávač, takže to nebude používat SEO verbež. Na druhou stranu ale ani nepůjde najít daný text, když člověk nezná odkaz.

Ono je to právě proto aby se

Ono je to právě proto aby se to nadalo najít, proč by to někdo šifroval aby se to pak dalo dohledat ve vyhledávači. Nejlépe kdyby tam byli možnosti. Něco jako Public, který by byl klasika plaintext a pak Protect, který by používal právě tohle šifrování. Jinak mě se to moc líbí.

odkaz

urcire doporucuji notepad.cc je bez registrace a ma spousta veci a mate 2 varianty textu read-only a admina :)

Aktualizace

Už vyšla novejší verze 0.19.. na serveru je stará 0.15 .... chtělo by to aktualizaci :-)