Hlavní moderátor Popular Post vEnd 279 Odesláno: 3. Duben, 2016 Hlavní moderátor Popular Post Share Odesláno: 3. Duben, 2016 Zdravím, tématem tohoto návodu bude hashování hesel; řeč bude zejména o nové funkci, která do SA:MP přibyla od verze 0.3.7 R1 – SHA256_PassHash. Opravdu jsem nevěděl, jakou zvolit obtížnost, ale vzhledem k úrovni vědomostí většiny místních uživatelů jsem se rozhodl pro 3/5 (pro středně pokročilé).Obtížnost: Co je hashování a k čemu sloužíPojem hashování znamená převod dat (v našem případě to budou hesla hráčů) na otisk neboli hash. K tomuto převodu nám slouží tzv. hashovací funkce. Hash, který nám vznikne, má několik klíčových vlastností:– nezáleží na tom, jak velká data jsou, výsledný hash bude mít velikost vždy pevně danou;– i při sebemenší změně dat (např. změna hesla z "ahoj123" na "ahej123") se bude výsledný hash podstatně lišit;– z hashe se k původním datům prakticky nelze dostat (proto jsou hashovací funkce označovány jako jednosměrné).Z těchto bodů by Vám už mělo být jasné, k čemu je hashování dobré – k ochraně citlivých údajů a procesů, kterými hesla nepochybně jsou.SHA-256SHA-256 je hashovací funkce pocházející z rodiny hashovacích funkcí SHA-2. Používají ji kupříkladu protokoly TSL a SSL, ale své uplatnění najde i v Linuxu. V pawn tato funkce vypadá následovně: _ SHA256_PassHash(password[],salt[],ret_hash[],ret_hash_len) _ password[] – heslo, ze kterého chceme získat hash;salt[] – kryptovací "sůl", o které si za chvíli povíme;ret_hash[] – výsledný hash;ret_hash_len – délka výsledného hashe, která bude vždy 64.Solíme a solímeV úvodu o hashování jsem zmínil, že kryptografické hashovací funkce jsou jednosměrné, tedy že původní data z výsledného hashe už sotva získáme zpět.K těmto funkcím lze ještě přidat takzvanou sůl, což jsou náhodná data, která se připojují navíc k původním datům.Toto uplatníme právě při hashování hesel. Zvolí-li si uživatelé náhodou stejné heslo, díky unikátnímu "osolení" nám tak vznikne více variant, čímž zabráníme možným slovníkovým a podobným útokům.Co byste měli mít na paměti při generování soli:– sůl musí být vždy náhodně vygenerována, pokud budeme solit stále stejnou solí, bude to postrádat efekt;– tvoříme dlouhou sůl; pokud by si útočník chtěl udělat tabulku možných solí, sůl o délce dvou znaků by nám moc nepomohla.A jdeme skriptovatTeď, když už víme vše potřebné, je načase si ukázat, jak to bude vypadat v kódu. Vytvořím jednoduchý registrační systém, kam budu ukládat jen heslo a sůl.Jako první si nadeklarujeme potřebné proměnné. new pPassw[MAX_PLAYERS][65]; //hash bude mít vždy délku 64 znaků + EOS new pSalt[MAX_PLAYERS][11]; //délku soli jsem zvolil 10 znaků + EOS _ Následně si nadefinujeme pomocné funkce. GenerateSalt() //vygeneruje nám náhodnou sůl o délce 10 znaků { new salt[11]; for(new i;i<10;i++) salt[i] = random(126-33) + 33; //od ASCII 33 ('!') až po 126 ('~') salt[10] = EOS; return salt; } GetPath(playerid) //vrátí nám cestu k uživatelově souboru { new path[6+MAX_PLAYER_NAME+4+1]; GetPlayerName(playerid,path,sizeof path); format(path,sizeof path,"users/%s.txt",path); return path; } _ Nyní si ukážeme, jak to bude vypadat při registraci. public OnDialogResponse(playerid,dialogid,response,listitem,inputtext[]) { if(dialogid == DIALOG_REGISTER) { new File:f,salt[11],str[100]; salt = GenerateSalt(); //vygenerujeme náhodnou sůl SHA256_PassHash(inputtext,salt,pPassw[playerid],sizeof pPassw[]); //k zadanému heslu (inputtext) se přidá sůl (salt) a výsledný hash se uloží do pPassw[playerid] f = fopen(GetPath(playerid),io_write); //otevření souboru v režimu zápisování format("%s\r\n%s\r\n",pPassw[playerid],salt); //zapisované údaje (heslo a sůl) fwrite(f,str); //zápis do souboru fclose(f); //uzavření souboru return 1; } } _ Registraci se zápisem hashe bychom měli. Nyní se podíváme na to, jak budeme postupovat při přihlášení. Navazujeme na kód výše dialogem pro přihlášení. else if(dialogid == DIALOG_LOGIN) { new File:f,hash[65]; f = fopen(GetPath(playerid),io_read); //otevření souboru v režimu čtení fread(f,pPassw[playerid]); //přečtení hesla ze souboru fseek(f,2,seek_current); //přeskočení bílých znaků fread(f,pSalt[playerid]); //přečtení soli ze souboru fclose(f); //uzavření souboru SHA256_PassHash(inputtext,pSalt[playerid],hash,sizeof hash); //k zadanému heslu (inputtext) se přidá sůl (pSalt[playerid]) a výsledný hash se uloží do proměnné hash if(!strcmp(hash,pPassw[playerid])) //pokud je přihlašovací hash shodný s hashem ze souboru, jsou hesla identická { //správné heslo = úspěšné přihlášení } else { //nesprávné heslo = neúspěšné přihlášení } return 1; } _ Tím, že jsme k přihlašovacímu heslu přidali stejnou sůl jako při registraci hráče a celé ho poté zahashovali, nám musí vzniknout identický hash s hashem v souboru. Je-li tomu tak, uživatel zadal správné heslo, došlo k úspěšnému přihlášení. Pokud se hashe shodovat nebudou, bylo zadáno špatné heslo. Právě z tohoto důvodu je nutné zapisovat sůl do souboru společně s otiskem hesla. ZávěrA to by bylo vše. Probrali jsme základní principy hashování, možnost SHA-256 hashování v pawn, ukázali si, jak vytvořit registrační soubor. Mimoto také můžeme vidět, že se dá obejít bez různých includů pro práci se soubory. Předem varuji, že kódy slouží pouze a jen jako ukázka. Cílem nebylo vytvořit registrační systém, jen poukázat na možnosti hashování. Pozdější komentáře typu: "Zkopíroval jsem to a nejde mi to!" budou pravděpodobně ignorovány nebo tězce zkritizovány ostatními.Samozřejmě, pokud jste našli jakoukoli chybu v tom, co jsem napsal, neváhejte mi zde zanechat vzkaz! Totéž platí i v případě, chcete-li se na něco zeptat nebo mi jen vyjádřit svůj názor. Návod označen jako platný Ten to návod byl označen jako platný.Návod může být kdykoli označen jako nevhodný či neplatný 1 5 Link to comment Share on other sites More sharing options...
Pán Podnikateľ 52 Odesláno: 3. Duben, 2016 Share Odesláno: 3. Duben, 2016 Nedá mi nezareagovať na toto téma.Po prečítaní musím potvrdiť že je to veľmi pekne a zrozumiteľne napísané. Tím pádom hádam tomu každý porozumie kto bude chcieť daný hash použiť. Myslím si že SK/CZ komunita má aj na dve hviezdičky ale tak to nevadí. Link to comment Share on other sites More sharing options...
Hlavní moderátor vEnd 279 Odesláno: 3. Duben, 2016 Author Hlavní moderátor Share Odesláno: 3. Duben, 2016 Nedá mi nezareagovať na toto téma. Po prečítaní musím potvrdiť že je to veľmi pekne a zrozumiteľne napísané. Tím pádom hádam tomu každý porozumie kto bude chcieť daný hash použiť. Myslím si že SK/CZ komunita má aj na dve hviezdičky ale tak to nevadí. Ono v konečném důsledku o ty hvězdičky ani nejde, kdo si to bude chtít přečíst, přečte si to. A je jedno, jestli to bude profík či amatér. Jinak díky. Link to comment Share on other sites More sharing options...
Globální moderátor HighPrint 177 Odesláno: 3. Duben, 2016 Globální moderátor Share Odesláno: 3. Duben, 2016 Vždycky mě pobaví když někdo použije výraz kryptografická sůl Link to comment Share on other sites More sharing options...
Hlavní moderátor vEnd 279 Odesláno: 3. Duben, 2016 Author Hlavní moderátor Share Odesláno: 3. Duben, 2016 Vždycky mě pobaví když někdo použije výraz kryptografická sůl Je to slovní spojení tak komické? Link to comment Share on other sites More sharing options...
BTomas 0 Odesláno: 3. Duben, 2016 Share Odesláno: 3. Duben, 2016 Urcite se hodi.. tyto funkce.. Link to comment Share on other sites More sharing options...
Tomas99 0 Odesláno: 3. Duben, 2016 Share Odesláno: 3. Duben, 2016 Parádní "návod" Popravdě jsem ani o téhle nové funkci nevěděl. Až dnes jsem zjistil, že už je i 0.3.7 R2 Odesláno z mého SM-G318H pomocí Tapatalk Link to comment Share on other sites More sharing options...
Paulee 16 Odesláno: 4. Duben, 2016 Share Odesláno: 4. Duben, 2016 Pěkné Ani jsem nevěděl, že toto existuje. GJ Link to comment Share on other sites More sharing options...
DNLS 31 Odesláno: 5. Duben, 2016 Share Odesláno: 5. Duben, 2016 Super, 9/10... Alespoň se zase něčemu přiučím Link to comment Share on other sites More sharing options...
Globální moderátor Hip 191 Odesláno: 5. Duben, 2016 Globální moderátor Share Odesláno: 5. Duben, 2016 Díky za návod. Je parádní a ještě tu není Je to slovní spojení tak komické? (kryptografická sůl) velmi komické Link to comment Share on other sites More sharing options...
LukYs 1 Odesláno: 6. Duben, 2016 Share Odesláno: 6. Duben, 2016 tak jsem se neco priucil 9/10 Link to comment Share on other sites More sharing options...
ATomas 286 Odesláno: 23. Duben, 2016 Share Odesláno: 23. Duben, 2016 (upraveno) Konecne vidim na pawno.cz nekoho kdo pawno fakt umi Ale precijenom jsem nasel chybicku fread(f,pPassw[playerid]); //přečtení hesla ze souboru fseek(f,2,seek_current); //přeskočení bílých znaků fread(f,pSalt[playerid]); //přečtení soli ze souboru funkce fread precte radek (nebo pocet znaku ktera ji omezuje promena do ktere to nacita), ovsem do promene ulozi i ty bile znaky. Takze fseek je zde pouzit zbytecne, a hlavne chybne protoze ti "ukradne" prvni dva znaky ze soli. A navic 2 bile znaky budes mit v souboru jen pokud bude konec radku zapsan jako \r\n coz je na windowsovych systemech. Linux ukoncuje radek pouze \n. Takze pokud to nekdo editne treba pomoci 'mc' nebude mu to fungovat. Tento problem resi jednoducha funkce stock DelEnd(string[]) { new ln = strlen(string); if(ln > 1 && string[ln-2] == '\r') { string[ln-2] = 0; return ln-2; } else if(ln > 0 && string[ln-1] == '\n') { string[ln-1] = 0; return ln-1; } return ln; } ktera odmaze jakykoliv enter z konce radku (pokud tam je) a vrati novou delku retezce (hodi se pro zjisteni, zdali vubec bylo neco odmazano) Edited 23. Duben, 2016 by ATomas Link to comment Share on other sites More sharing options...
Hlavní moderátor vEnd 279 Odesláno: 23. Duben, 2016 Author Hlavní moderátor Share Odesláno: 23. Duben, 2016 (upraveno) Mýlíš se, v tomto případě to neplatí. Pole, do kterého ukládám heslo, má přesně vymezenou velikost, takže když do něj uložím hodnotu fread, na bílé znaky už nezbyde. Při dalším čtení, tedy tom, kde se má přečíst sůl, dojde k přečtení toho, co zbylo, tedy těch dvou znaků. Nekecám. Když jsem ten návod psal, kód jsem samozřejmě zkoušel a přesně tohle se stalo. Trvalo mi asi 15 minut, než jsem na to přišel. Netuším, jestli se to podobně chová i v C, každopádně v Pawn ano. Edited 23. Duben, 2016 by vEnd Link to comment Share on other sites More sharing options...
ATomas 286 Odesláno: 26. Duben, 2016 Share Odesláno: 26. Duben, 2016 (upraveno) Mýlíš se, v tomto případě to neplatí. Pole, do kterého ukládám heslo, má přesně vymezenou velikost, takže když do něj uložím hodnotu fread, na bílé znaky už nezbyde. Při dalším čtení, tedy tom, kde se má přečíst sůl, dojde k přečtení toho, co zbylo, tedy těch dvou znaků. Nekecám. Když jsem ten návod psal, kód jsem samozřejmě zkoušel a přesně tohle se stalo. Trvalo mi asi 15 minut, než jsem na to přišel. Netuším, jestli se to podobně chová i v C, každopádně v Pawn ano. Jo pravda nato jsem pozapomel Ovsem porad se spolehas nato ze je ti ten soubor nikdo needitoval v unixovem systemu Edited 26. Duben, 2016 by ATomas Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now