Seguridad de Bases de Datos
PHP Manual

Modelo de almacenamiento encriptado

SSL/SSH proteje los datos que viajan desde el cliente al servidor: SSL/SSH no proteje los datos persistentes almacenados en una base de datos. SSL es un protocolo para proteger los datos mientras viajan en el cable.

Una vez un atacante gana acceso directamente a su base de datos (sobre pasando el servidor web), los datos sensibles podrían ser divulgados o mal utilizados, a menos que la información esté protegida en la base de datos por sí misma. Encriptando los datos es una buena forma de mitigar esta amenaza, pero muy pocas bases de datos ofrecen este tipo de encripción de datos.

La forma más fácil para trabajar en este problema, es crear primero su propio paquete de encripción, y utilizarlo desde de sus scripts de PHP. PHP puede guiarle en esto con muchas extensiones, tales como Mcrypt y Mhash, cubriendo así, una amplia variedad de algoritmos de encripción. El script encripta los datos antes de insertarlos dentro de la base de datos, y los desencripta cuando los devuelve. Vea las referencias para ejemplos adicionales de como funciona la encripción.

En caso de datos que deben estar ocultos, si no fuera necesario usar su representación real (es decir, que no se mostrarán), quizás convenga utilizar hashing. El ejemplo más típico de hashing es cuando se almacena el hash MD5 de una contraseña en una base de datos, en lugar de almacenar la contraseña en sí misma. Vea también las funciones crypt() y md5().

Ejemplo #1 Utilizando campos de contraseña con hash

<?php

// Almacenando la contraseña con hash
// $random_chars se obtuvo, p.ej., usando /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);

// Consultando si el usuario envió la contraseña correcta
$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 
'Bienvenido, ' htmlspecialchars($username) . '!';
} else {
    echo 
'La autenticación ha fallado para ' htmlspecialchars($username) . '.';
}

?>

Seguridad de Bases de Datos
PHP Manual