Model de stocare criptată

SSL/SSH protejează traversarea datelor de la client la server, însă SSL/SSH nu protejează datele stocate în baza de date. SSL este un protocol de tranzit.

Odată ce atacatorul capătă acces la baza de date direct (evitând serverul web), informația stocată poate fi expusă sau abuzată, dacă ea nu este protejată de însăși baza de date. Criptarea datelor este o bună masură pentru a diminua acest risc, însă prea puține baze de date oferă acest tip de criptare.

Cea mai ușoară cale de a rezolva problema este de a crea propriul pachet de criptare, și apoi folosirea lui cu scripturile PHP. PHP vă poate ajuta în aceasta prin intermediul câtorva extensii, cum ar fi Mcrypt și Mhash, care acoperă o varietate largă de algoritmi de criptare. Scriptul criptează datele înainte de a fi inserate în baza de date, și le decriptează la extragerea acestora. Verificați documentația de rigoare pentru a studia mai multe despre modalitățile de operare ale criptării.

Hashing

În cazul datelor cu adevărat ascunse, dacă reprezentarea lor deschisă nu este necesară (de ex. nu vor fi afișate), ar trebui luată în considerare procedura de hashing. Cel mai cunoscut exemplu este stocarea hash-ului criptografic al unei parole în baza de date, în loc de stocarea parolei înseși.

În PHP 5.5 sau ulterior funcțiile de lucru cu parole oferă o metodă comodă de a transforma în hash date confidențiale și de a lucra mai departe cu aceste hash-uri. În PHP 5.3.7+ poate fi utilizată și biblioteca »  password_compat.

password_hash() este utilizată pentru a transforma în hash un șir de caractere dat utilizând cel mai puternic algoritm disponibil la moment, și password_verify() verifică dacă o parolă dată se potrivește hash-ului stocat în baza de date.

Example #1 Transformarea parolei în hash

<?php

// storing password hash
$query  sprintf("INSERT INTO users(name,pwd) VALUES('%s','%s');",
            
pg_escape_string($username),
            
password_hash($passwordPASSWORD_DEFAULT));
$result pg_query($connection$query);

// querying if user submitted the right password
$query sprintf("SELECT pwd FROM users WHERE name='%s';",
            
pg_escape_string($username));
$row pg_fetch_assoc(pg_query($connection$query));

if (
$row && password_verify($password$row['pwd'])) {
    echo 
'Welcome, ' htmlspecialchars($username) . '!';
} else {
    echo 
'Authentication failed for ' htmlspecialchars($username) . '.';
}

?>

În versiuni mai vechi ale PHP aceasta poate fi obținut cu ajutorul funcției crypt().

Example #2 Transformarea parolei în hash utilizând crypt()

<?php

// storing password hash
// $random_chars retrieved e.g. using /dev/random
$query  sprintf("INSERT INTO users(name,pwd) VALUES('%s','%s');",
            
pg_escape_string($username),
            
pg_escape_string(crypt($password'$2a$07$' $random_chars '$')));
$result pg_query($connection$query);

// querying if user submitted the right password
$query sprintf("SELECT pwd FROM users WHERE name='%s';",
            
pg_escape_string($username));
$row pg_fetch_assoc(pg_query($connection$query));

if (
$row && crypt($password$row['pwd']) == $row['pwd']) {
    echo 
'Welcome, ' htmlspecialchars($username) . '!';
} else {
    echo 
'Authentication failed for ' htmlspecialchars($username) . '.';
}

?>