NOVINKA! E-learningové kurzy umělé inteligence. Nyní AI za nejlepší ceny. Zjisti více:
NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!

Diskuze: Jak zašifrovat data v URL

V předchozím kvízu, Online test znalostí PHP, jsme si ověřili nabyté zkušenosti z kurzu.

Aktivity
Avatar
katrincsak
Člen
Avatar
katrincsak:25.6.2017 17:19

Zdravím,

potřeboval bych radu jak tento problém řešíte vy. Potřebuji zašifrovat některé údaje, které se přenáší za pomocí URL. Chci rozeslat URL ve kterém bude kod, který bude mít informaci o určitém oprávnění a přiřazením do správné sekce. Zároveň bych rád tyto informace ukryl z důvodu zvýšení bezpečnosti.

Nejde zase o bůhví jakou bezpečnost jako spíše o nějaké lepší zabezpečení. Stejně po registraci se registrace s určitým oprávněním potvrzuje, ale je již jasné, že nelze mít úplně kontrolu zda to budou řádně kontrolovat. Takže jde spíše jen o obranu vůči chytřejším/zna­lejším uživatelům ;-)

Obyčejné "base64_encode" úplně nechci. Rád bych klidně něco podobného, ale něco do čeho je možné přidat jen něco jako "salt(sůl)" která by provedla změnu pravých informací a následně klidně to provést do base64. Potřebuji ale mít možnost zpětně dešifrovat kod díky znalosti přidané soli. Mohl bych provést třeba 10x base64_encode, ale to se mi z důvodu absurdního řešení nelíbí.

Děkuji moc za rady !

 
Odpovědět
25.6.2017 17:19
Avatar
Odpovídá na katrincsak
Wal De Mar-Lad:25.6.2017 17:29

Budeš skôr musieť napísať čo konkrétne chceš dosiahnúť, akú informáciu posielaš v tej url a za akým účelom, lebo zatiaľ to znie nezmyselne a zbytočne. Napíš o čo Ti ide a odpíšem Ti aký princíp sa na to používa.

Nahoru Odpovědět
25.6.2017 17:29
Libraries over frameworks...
Avatar
Eda Stehlík
Člen
Avatar
Eda Stehlík:25.6.2017 17:35

A co to vůbec nedešifrofat ale zašifrovat kod z url a poměřit ho s jedním schovaným v databázi.
Něco jako:

$code = $_GET["code"];
$sifra = $code . "dedertbnbvfntr@[fgrmfuxdercu##efnrf";

$baseCode = $db->prepare("SELECT * FROM tabulka WHERE code=SHA1(:code)");
$baseCode->bindParam(":code", $sifra);
$baseCode->execute();
$baseCodeStatus = $baseCode->fetch()

if (!$baseCodeStatus){
  echo("Nespravny kod");
}
else {
  //Pokracovani kodu
}
 
Nahoru Odpovědět
25.6.2017 17:35
Avatar
Odpovídá na katrincsak
Wal De Mar-Lad:25.6.2017 17:50

Upresním radšej, prečo je to nezmysel... Pokiaľ ideš nad protokolom https, nie je dôvod túto informáciu šifrovať. Pretože tá požiadavka na server už šifrovaná je, cestou ju nikto neodchytí. A že je na koncových bodoch nešifrovaná, to je v poriadku. Lebo na serveri ju aspoň netreba dešifrovať, ušetríš čas a výpočtový výkon, a že ju vidí klient v adresnom riadku nešifrovanú je tiež jedno, lebo on beztak vie, že do danej časti stránky prístup má. No a ak by tú informáciu videl niekto poza chrbát autorizovaného klienta, tomu to tiež bude na nič, lebo do danej časti nebude prihlásený, takže sa tam aj tak nedostane bez mena a hesla. Preto mi Tvoja otázka pripadá nelogická a najjednoduchším riešením zatiaľ vyzerá byť použitie https protokolu, čo je dnes beztak skôr povinnosť, ako voľba.

Nahoru Odpovědět
25.6.2017 17:50
Libraries over frameworks...
Avatar
katrincsak
Člen
Avatar
Odpovídá na Wal De Mar-Lad
katrincsak:25.6.2017 17:57

Potřebuji zašifrovat tohle a předat metodou GET.

"{"typ": "add_group", "group_id":"8238599;8238600;8238602"}"

Informaci si rád uložím v JSON, abych s tím pak mohl lépe pracovat, lze do budoucna počítat, že by tam bylo více informací. A jde jen o to, aby nějaký šikula neprovedl base64_decode a v případě znalosti jiných ID, aby nedošlo k modifikaci. Na víc jde o redakční systém a tak mám možnosti z důvodu rozsahu zásahu omezené.

A tak to co jsem uvedl potřebuji zašifrovat, ale i zpětně dešifrovat.

Ještě jinak řečeno. Ty dostaneš URL s kodem, který se rovnou propíše do reg.formuláře. Případně dostaneš jenom ten kod. Ten kod bude ukrývat informaci, který řekne kam s registrovaným uživatelem.

 
Nahoru Odpovědět
25.6.2017 17:57
Avatar
katrincsak
Člen
Avatar
Odpovídá na Eda Stehlík
katrincsak:25.6.2017 17:58

SHA1 je pouze jednosměrné šifrování a já ty informace neznám, které se budou šifrovat. Potřebuji ale znát algoritmus na dešifrování.

Editováno 25.6.2017 17:58
 
Nahoru Odpovědět
25.6.2017 17:58
Avatar
Odpovídá na katrincsak
Wal De Mar-Lad:25.6.2017 18:03

Nie je podstatné, či tú informáciu prenesieš cez get, či post. Celá tá požiadavka bude predsa nad https šifrovaná automaticky.

Nahoru Odpovědět
25.6.2017 18:03
Libraries over frameworks...
Avatar
Petr Čech
Tvůrce
Avatar
Petr Čech:25.6.2017 18:14

Děláš to špatně. Nesmíš dovolit, aby mohl uživatel pomocí podvržení URL obejít zabezpečení. Prostě musíš počítat s tím, že ti může HTTP parametrech (jak POST, tak GET) přistát absolutně cokoliv. Tohle musíš řešit na straně serveru.
V momentě kdy zpracováváš ten požadavek musíš ošetřit, jestli taková akce může nastat a až potom ji vykonat.
Pokud do nepotřebuješ skrýt před klientem, ale kýmkoliv jiným, použij HTTPS. Mnoho hostingů už nabízí Let's encrypt certifikát zdarma.

Nahoru Odpovědět
25.6.2017 18:14
the cake is a lie
Avatar
katrincsak
Člen
Avatar
Odpovídá na Wal De Mar-Lad
katrincsak:25.6.2017 18:19

Proč řešit věci, které s tím nesouvisí? To je logické že to přes https je automaticky šifrované, ale řešíš věc až od konce. Na víc ten kod nemusí vůbec jít přes https, nebo jakýkoliv jiný protokol. Ten kod může být předán jakoukoliv formou a to např. emailem. Já pokuď si ten kod vezmu a dešifruji si ho, upravím hodnoty, zašifruju, zaregistruju se tak již https projde modifikovaný kod a to mi je již k ničemu.

Proto píšu, že potřebuji něco čím dokážu zašifrovat nějaký string a zpětně ho dešifrovat.

 
Nahoru Odpovědět
25.6.2017 18:19
Avatar
katrincsak
Člen
Avatar
Odpovídá na Petr Čech
katrincsak:25.6.2017 18:26

Ale já potřebuji zašifrovat string, který předám za pomocí URL metodou GET. Nějaké šifrování, nebo zabezpečení na HTTP/HTTPS je pozdě. Potřebuji jen minimalizovat možnost dešifrovat předané údaje. Ono se sice zas tak moc neděje, protože spolu s tím hraje xx dalších faktorů, ale bude to lepší vůči šťouralům.

Ten kod, nemusí být poslán v URL, ale i emailem, nebo jakoukoliv jinou metodou. Když si to budou tisknout a pak opisovat to je už na koncové firmě. :)

 
Nahoru Odpovědět
25.6.2017 18:26
Avatar
katrincsak
Člen
Avatar
katrincsak:25.6.2017 18:29

Pro ještě lepší upřesnění...
Předání kodu za pomocí URL je jen uživatelské zjednodušení, aby ten kod nemuseli vyplňovat do políčka "ověřovací kod".

 
Nahoru Odpovědět
25.6.2017 18:29
Avatar
Petr Čech
Tvůrce
Avatar
Odpovídá na katrincsak
Petr Čech:25.6.2017 18:34

Tak můžeš to prohnat nějakým symetrickým algoritmem (třeba AES) a šifrovat klíčem, který bude u tebe na serveru.
Ale není to vůbec standardní řešení. Tvůj web musí za každých okolností odolat podvržené URL, tedy jak ty říkáš šťouralům, kteří si prostě vymění ty parametry.
Nevím přesně, co chceš dělat, proto to je možná mimo mísu, ale také se často používají jednorázové tokeny- nepředáváš samotná data, protože jsou třeba velká nebo je právě nechceš prozradit. Proto si ten objekt uložíš v DB a uživateli dáš token, pomocí kterého si může samotný objekt zobrazit.
PS: hodně by pomohlo, kdybys nám sdělil, co se to vlastně snažíš, ale konkrétněji.

Editováno 25.6.2017 18:35
Nahoru Odpovědět
25.6.2017 18:34
the cake is a lie
Avatar
Odpovídá na katrincsak
Wal De Mar-Lad:25.6.2017 18:35

Nerobíš dobre, ideš na to príliš neštandardne. Ale OK. V prehliadačoch od IE 11 máš Web Crypto API, môžeš šifrovať. Ale varujem Ťa, že je to netriviálna tématika a je veľmi ľahké nesprávne ho použiť, čo Ti v princípe anuluje celú bezpečnosť. Plus, toto API nemá protistranu näv PHP, musíš si sám nájsť a správne použiť kryptovacie funkcie v PHP za účelom následného dešifrovania správy. Jednoduchšie bude ak vygoogliš knižnicu, ktorá je aj pre JS, aj pre PHP - menšia šanca, že to zmrvíš... Ale opakovane Ťa varujem, vyhni sa tomuto ak je to čo len trochu možné, lebo musíš fakt vedieť čo robíš. A na stackoveflow rovno zabudni, ten je práve kvôli radám o zabezpečení považovaný za nebezpečný - stačí pogoogliť článok "stackoverflow considered harmful". Hoci za takúto radu body za riešenie nezískam, musím si za tým stáť - nerob to...

Nahoru Odpovědět
25.6.2017 18:35
Libraries over frameworks...
Avatar
katrincsak
Člen
Avatar
Odpovídá na Petr Čech
katrincsak:25.6.2017 18:49

Kdybych mohl, napsal bych to úplně konkrétně, ale jsou některé informace které nemohu sdělit. Ale zkusím to.

Jedná se o web na který budou mít přístup jen zaměstnanci firem. Každý zaměstnanec na webu uvidí jen něco podle přiřazené skupiny oprávnění. Řekněme, že budou 3 skupiny a každá skupina má jiné oprávnění. Firma pro každou tu skupinu dostane kod, který tady řeším. Tedy dostane 3 kody a ten kod si rozešlou svým zaměstnancům. Oni ten kod vloží do registrace, nebo eventuálně vyfasují url s GET který provede automatické propsání do inputu. Uživatel se zaregistruje, já na straně serveru získám ten kod, který dešifruji a získám informaci od jaké firmy uživatel je a do jaké skupiny má být zařazen. Jakmile podle ID tohle dohledám, tak se provede registrace a admin firmy již v administraci uvidí uživatele, který čeká na schválení. Bez schválení se uživatel stejně nezaregistruje.

Jde jen o to, aby mohli hromadně rozeslat registraci a měli s tím co nejméně práce. A tím, že na tom hodně závisí lidský faktor, rád bych tomu dopomohl lepším zabezpečením. I kdyby to dešifrovali musí znát IDčka, kterých je několik a vytváří jistou stromovou strukturu a tak určitě nestačí jen změnit jedno ID, aby např. byl v jiné firmě a na víc uživatele musí potvrdit admin/správce. A tak by sice zakodování do base64 mohlo stačit, ale rád bych tomu přidal něco na víc.

 
Nahoru Odpovědět
25.6.2017 18:49
Avatar
katrincsak
Člen
Avatar
Odpovídá na Wal De Mar-Lad
katrincsak:25.6.2017 18:54

Já si spíše myslím, že jsi úplně nepochopil můj dotaz :( Zkus si ještě přečíst co jsem teď napsal Petrovi).

 
Nahoru Odpovědět
25.6.2017 18:54
Avatar
Odpovídá na katrincsak
Wal De Mar-Lad:25.6.2017 18:59

Prečítal som si to a naprosto nechápem prečo chceš nejaké id šifrovať, keď ho chceš následne niekomu dať. Veď z tých rozdaných ID nemusí byť vôbec jasné do ktorej časti webu bude mať následne prístup.

Nahoru Odpovědět
25.6.2017 18:59
Libraries over frameworks...
Avatar
katrincsak
Člen
Avatar
Odpovídá na Wal De Mar-Lad
katrincsak:25.6.2017 19:07

To máš pravdu, ale oni se ty ID už moc nezmění, pro tu konkrétní firmu a tak bych rád tomu přidal jen něco co není tak dobře čitelné a že to dokáže dešifrovat po přečtení jednoho návodu. V opačném případě raději udělám to, že každé skupině přiřadím ještě speciální klíč, ale v rámci technologie na redakčním systému je celkem sranda ty informace kombinovaně získávat a tak bych se rád tomu vyhnul. Ale i za tohoto předpokladu ten kod pro tu skupinu bude stejný dokuď si třeba firma nevyžádá nový kod.

Proto se snažím vysvětlit, že není potřeba v tom hledat bůhví jakou bezpečnost a že jen potřebuji nějakým chytrým způsobem schovat konkrétní informace.

Např. bych si mohl udělat funkci, že čísla 1 až 9 převedu na písměna A až J a následně převedu do ASCI a pak to hodím do base64 . A tak spíše zda je nějaká funkce od PHP do které bych vložil jen právě nějaké slovo, které dopomůže to zašifrovat, ale potřebuji při tom slovu to i zpětně dešifrovat.

 
Nahoru Odpovědět
25.6.2017 19:07
Avatar
Peter Trcka
Člen
Avatar
Peter Trcka:4.7.2017 18:05

Ahoj ak už máš db_tabulku vyplnenu a id potrebujes iba ako validaciu ( niečo podobné ako bývajú registračné emaily) tak by som si vytvoril na tvojom mieste ešte stĺpec token_id ktorý bude unique a namiesto id posli jeho.

skript napr: nahodne číslo, ktore preženieš cez md5.

 
Nahoru Odpovědět
4.7.2017 18:05
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 18 zpráv z 18.