Autentizácie menom a heslom
Autentizácie menom a heslom patrí medzi najrozšírenejšie spôsoby autentizácie. V tomto článku si ukážeme, na čo si dať pozor, ak sa rozhodneme tento spôsob autentizácie implementovať. Najprv si ale pripomenieme, čo znamenajú pojmy autentizácie a autorizácie.
Autentizácie a autorizácie
Subjektom nazveme kohokoľvek, kto komunikuje s našou aplikáciou. Typicky sa jedná o užívateľov, však subjektom môže byť aj ďalšie systém či aplikácie.
Autentizácia je proces overenia identity subjektu. V prípade autentizácie menom a heslom sa teda jedná o overení, že zadané meno a heslo je správne a subjekt je skutočne tým, kým tvrdí, že je.
Autorizáciu možno chápať ako proces overenia oprávnenia. Subjektu, ktorý nemá potrebné oprávnenia, nie je umožnené danú akciu vykonať. Aby subjekt potrebné oprávnenia získal, musí sa najprv autentifikovať.
Príkladov na autentizáciu a autorizáciu existuje celý rad. Uveďme jeden príklad zo života.
Mladíci Peter a Pavol išli do krčmy na pivo. Pri objednávaní chcel čašník vidieť ich občianky. Petr občianku nemal (neautentizoval sa), a preto pivo nedostal (nebol autorizovaný na pitie piva). Pavel občianku ukázal (autentizoval sa) a pivo dostal.
Sami dokážete iste vymyslieť mnoho ďalších príkladov.
Uloženie hesla
Alfou a omegou autentizácie menom a heslom je problém uloženia hesla. Naša aplikácia potrebuje vedieť rozhodnúť, či je zadané heslo daného používateľa správne.
Najjednoduchším riešením, ktoré nás napadne, je do databázy uložiť spolu s užívateľským menom i heslo. Takéto riešenie je však veľmi nebezpečné, pretože každý, kto získa prístup do databázy, získa zároveň heslá všetkých užívateľov.
Lepším riešením je uložiť do databázy namiesto hesla iba jeho hash. Na výpočet hashe použijeme niektorú zo štandardných haš funkcií napr. SHA-256.
Hashovacie funkcie sú jednosmerné, čo v praxi znamená, že neexistuje žiadny efektívny algoritmus, ktorý by dokázal z hodnoty hashe vypočítať pôvodnú vstupnú hodnotu.
Laici občas zamieňajú pojmy hashovanie a šifrovanie (resp. Kryptovanie). Niekedy hovoria, že heslá kryptuje, hoci je Vytváram hash. Jedná sa však o úplne rozdielne algoritmy. Hashovacie funkcie dostane vstup a vráti výstup fixné dĺžky. Šifrovacie funkcie pre daný kľúč a vstup (otvorený text) vráti výstup (šifrový text). Z šifrového textu možno vďaka znalosti kľúča získať späť otvorený text.
V prípade, že do databázy uložíme miesto hesla iba jeho hash, prebieha následné overenie takto:
- Užívateľ zadá užívateľské meno a heslo a odošle ho našej aplikácii.
- V databáze sa pre zadané meno používateľa vyhľadá príslušný záznam.
- Ak žiadny záznam neexistuje, autentizácia zlyhá.
- Vypočíta sa hash zadaného hesla
- Porovná sa vypočítaný hash s hashom v databáze. Ak sa hodnoty zhodujú, užívateľ je úspešne autentizovaný. V opačnom prípade autentizácie zlyhá.
Toto riešenie má ale stále niekoľko nedostatkov:
- Z databázy možno ľahko spoznať, ktorí používatelia majú rovnaké heslá.
- Existujú vopred vypočítané konverznej tabuľky z hashe na pôvodný vstup. Schválne skúste napr. Do Google zadať B37DD682B63E2654CDBB67E6EADE9A2346EB12CD. Už viete aké je moje heslo, keď vám poviem, že toto je jeho hash?
- Veľkosť prevodových tabuliek možno redukovať pomocou techniky Rainbow tables.
Tieto nedostatky možno eliminovať pomocou tzv. Soli (anglicky salt).
Soľ
Soľ je náhodný reťazec, ktorý sa vygeneruje vždy pri vytvorení nového hesla alebo pri jeho zmene. Hash sa následne vypočíta z hodnoty soľ || heslo. Ak majú dvaja užívatelia rovnaké heslo, príslušné hodnoty hashe sa líšia, pretože sa líšia hodnoty soľou. Nájsť hodnotu vstupu pre daný hash je ťažšie, pretože dĺžka vstupu je vďaka soli väčší.
Pozrime sa, ako teraz prebieha overenie hesla:
- Užívateľ zadá užívateľské meno a heslo a odošle ho aplikáciu.
- V databáze sa pre zadané meno používateľa vyhľadá príslušný záznam.
- Ak žiadny záznam neexistuje, autentizácia zlyhá.
- Z načítaného záznamu sa získa hodnota soli a hodnota hashe.
- Zo soli a zadaného hesla sa vypočíta hash.
- Vypočítaný hash sa porovná s hashom v databáze. Ak sa hodnoty zhodujú, užívateľ je úspešne autentizovaný. V opačnom prípade autentizácie zlyhá.
V prípade SQL databázy, môžeme soľ buď uložiť do samostatného stĺpca, alebo do stĺpca jedného spolu s hashom.
Akú veľkosť soli zvoliť? Dostatočnú veľkosťou sa zdá byť 16 bytov, ktorú používa algoritmus crypt na Unixu. Organizácia OWASP odporúča veľkosti 4 alebo 8 bytov. Štandard PKCS # 5 uvádza odporúčanú dĺžku soli 8 bytov, ale táto soľ sa používa na odvodzovanie kľúčov z hesiel, čo je iný prípad použitia soli.
Neplatné meno alebo heslo
Existujú dva základné dôvody k zlyhaniu autentizácie menom a heslom.
- Užívateľské meno je neplatné
- Užívateľské meno je platné, ale heslo je neplatné
Aj keď naše aplikácie dokáže tieto stavy odlíšiť, z bezpečnostných dôvodov sa zvyčajne tieto informácie užívateľom neposkytujú. Ak by sme tieto informácie poskytovali, dávame potenciálnemu útočníkovi k dispozícii rozhranie, ktoré mu umožní zistiť, či existuje používateľ so zadaným menom alebo nie.
Bezpečná aplikácia by mala poskytovať presne toľko informácií, koľko je potrebné pre používateľov komfort, ale nič viac.
Zabudnuté heslo
Ľudia zabúdajú. Aplikácia by preto mala ponúkať nejaký spôsob, akým je možné vytvoriť nové heslo.
Nové heslo pokiaľ možno neposielame e-mailom. Namiesto toho radšej pošleme adresu stránky, na ktoré si užívateľ môže nové heslo zadať. Adresa by mala mať obmedzenú dobu platnosti.
Kvalita heslá
Ak v aplikácii zavedieme pravidlá, ktoré donúti užívateľa voliť silnejšie heslá, môžeme tým docieliť vyššej bezpečnosti. Určite je vhodné definovať minimálnu dĺžku hesla.
Druhou stranou mince takýchto pravidiel ale je, že tým používateľa obmedzujeme a znižujeme prívetivosť našej aplikácie. Vždy je potrebné zvážiť, aké pravidlá sú pre konkrétnu aplikáciu vhodná. Nie každého užívateľa poteší, keď si musí každý mesiac meniť heslo.
Webový formulár
U webových aplikácií používame k prenosu hesiel HTTP metódu POST, okrem iného aj preto aby sme zabránili zobrazenie heslá v URL prehliadača.
Niektoré webové prehliadače ponúkajú užívateľom možnosť zapamätanie hesla v prehliadači. To síce môže byť v niektorých prípadoch užitočné, však z bezpečnostných dôvodov môžeme chcieť túto funkciu vypnúť. To docielime nastavením atribútu autocomplete na hodnotu off. Atribút možno buď nastaviť pre celý formulár alebo na jednotlivých elementoch INPUT.
Záver
Hashovanie a solenie hesiel sú základnými techniky používaných pri ukladaní hesiel. V článku sme si vysvetlili, prečo je dobré tieto techniky používať a aké výhody to prináša.