In acest articol vom trata problema stocarii parolelor in cazul unei aplicatii care are nevoie de autentificare. Stocarea parolelor ridica doua mari probleme. Una de etica si una de siguranta.
Problema de etica este: Ca administrator al unui site/aplicatii este normal sa pot vedea ce parola are fiecare utilizator in parte?
Am fi tentati sa spunem ca da. Ca in calitate de administrator trebuie sa avem un control asupra a ceea ce face un utilizator (mai ales daca acesta poate adauga continut).
Ei bine, dupa parerea mea, raspunsul este NU. Administratorul site-ului nu trebuie sa aiba acces la parolele utilizatorilor. El nu trebuie sa stie care sunt acestea. Ai nevoie de acces la orice continut de pe site? Autentifica-te cu un cont cu drepturi elevate. Ca administrator ar trebui sa ai control de la tine din cont, fara sa te folosesti de cel al utilizatorului.
A doua problema care se pune este cea de securitate. Daca parolele sunt stocate in clar in baza de date avem o vulnerabilitate. Sa presupunem ca intr-un fel sau altul, cineva reuseste sa puna mana pe baza de date.
Da, stiu, asta este din start o problema dar nu despre ea discutam acum. Sa presupunem ca cineva rau voitor a reusit sa sparga sistemul si are acces la baza de date. Daca parolele sunt stocate in clar, ele pot fi folosite de cei care au comis frauda.
Deci, ce putem face pentru evitarea acestor neplaceri? Criptam parola inainte sa o stocam. Mai exact, luam parola din formularul de autenficare si o criptam inainte de salvarea in baza de date.
<?php $password = $_POST['password']; $password = md5($password); ?>
Codul nu va arata, evident, exact ca in exemplul meu. Voiam doar sa va arat principiul. Anume, luam parola din $_POST
si o criptam cu ajutorul algoritmului md5()
. Mai departe urmeaza sa stocam parola in baza de date.
Am ales algortimul md5()
pentru criptare pentru ca acesta este ireversibil. Nu are exista o metoda pentru decriptarea lui. Daca am fi folosit in schimb base64_encode()
cineva ar fi putut sa vina si sa aplice un base64_decode()
si ar fi obtinut parola in clar.
Tin sa mentionez aici ca si MySQL
are o metoda md5()
care face acelasi lucru, asa ca daca preferati, puteti sa criptati parola la acest nivel. Asta inseamna ca in loc sa prelucram datele in PHP
, ca in exemplul de mai sus, vom avea un INSERT
in MySQL
de forma:
INSERT INTO user(id, username, password) VALUES(1, 'mihai_baboi', md5('parolaMea'));
Procedura de mai sus se aplica la crearea unui cont, unde utilizatorul alege o parola si aplicatia o stocheaza in baza de date. Dar ce facem atunci cand trebuie sa autentificam utilizatorul? El ne da o parola de forma parolaMea
, iar in baza de date avem 14f9e87ba3b3a0abc5f0fefa45605ced
.
In cazul aceste trebuie sa criptam ceea ce vine din formular inainte de validare.
<?php // Aducem parola asa cum este ea in baza de date $dbPassword = getDbPasword(); // Incarcam o variabila cu ceea ce vine de la input $userPassword = $_POST['password']; // Comparam cele doua valori if($dbPassword == md5($userPassword)) { return true; } ?>
Nu vom discuta metoda getDbPassword()
. Ea este acolo strict ca sa ilustreze ca valoarea respectiva vine de undeva din baza de date. Ce este de observat este faptul ca se face comparatie intre valoarea din baza de date si rezultatul criptarii parolei venite din formularul de autentificare.
Acesta este felul in care putem rezolva atat problema de securitate cat si pe cea de etica in ceea ce priveste stocarea parolelor. Prin criptarea lor ne asiguram ca nici noi si nici terte persoane nu au acces la aceasta informatie cu caracter strict confidential.
Sursa foto.