Dacă aplicația nu este foarte secretă, atunci protejați doar o mică parte a informațiilor, de exemplu, informații despre parolă. Parolele nu trebuie în nici un caz să fie stocate în formă clară, deci sunt, de obicei, criptate. Cu toate acestea, în loc de criptare, puteți lua ca model practica adoptată în majoritatea sistemelor UNIX și în MySQL în sine: aplicați un algoritm hash la parolă și salvați rezultatul (convoluția) în tabel.
Spre deosebire de criptarea tradițională, care poate fi inversată, o funcție de hash bun este ireversibilă. Singura modalitate de a afla parola pe care a fost generată convoluția este de a folosi întregul bust (adică de a încerca toate opțiunile posibile de introducere) care necesită resurse uriașe de calcul.
În MySQL există trei funcții pentru parolele hashing: ENCRYPT (), SHA1 () și MD5Q 1. Pentru a vedea ce se întorc,
introduceți fiecare dintre ele la același text de intrare. Să facem asta cu exemplul p4ssword:
mysql> SELECT MD5 ('p4ssword'), ENCRYPT ('p4ssword'), SHA1 ('p4ssword') \ G
MD5 ("p4ssword"): 93863810133ebebe6e4c6bbc2a6ce1e7 ENCRYPT ("p4ssword"): dDCjeBzIycENk
Toate cele trei funcții returnează un șir de litere și numere de lungime fixă care pot fi stocate într-o coloană de tip CHAR. Întrucât ENCRYPT () poate să returneze litere în diferite registre, este mai bine să specificați tipul coloanei CHAR BINARY.
Nu utilizați niciodată funcția internă MySQL PAS SWO R D () în aplicații. Rezultatele returnate la aceasta depind de versiunea MySQL.
Pentru a menține convoluția datelor, această comandă este suficientă:
mysql> INSERT IN user_table (utilizator, permis) VALUES ('user', MD5 ('p4ssword'));
Pentru a verifica parola utilizatorului utilizatorului, puteți executa o interogare SELECT și verificați dacă convoluția parolei specificate este aceeași cu cea stocată în baza de date. În Perl, puteți face acest lucru după cum urmează:
meu $ sth = $ dbh-> pregăti ('SELECT * FROM user_table'
"WHERE user =. ȘI trece = MD5 (?) ');
Hashing parolele este o modalitate simplă și relativ sigură de a stoca parole într-o bază de date fără teama de hacking. Pentru a complica atacul dicționarului, aveți o combinație de nume de utilizator și parolă, astfel încât rezultatul să depindă de mai multe variabile:
meu $ sth = $ dbh-> pregăti ('SELECT * FROM user_table'
"WHERE user =. AND trece = SHA1 (CONCAT (.)) '); $ sth-> execute ($ username, $ username, $ password):
Singura problemă este riscul ca serverul să trimită parole într-o formă deschisă; Acesta poate fi scris ca text simplu în jurnalul de pe disc și este vizibil în memoria de proces dump. Pentru a reduce ușor acest risc, puteți să stocați parola într-o variabilă personalizată sau chiar să mutați hash-ul la nivelul aplicației pentru a rezolva problema la rădăcină. Pentru majoritatea limbajelor de programare, există funcții sau biblioteci de criptare. Puțin mai târziu vom examina problema criptării la nivel de aplicație.