Modelo de Armazenamento Criptografado

SSL/SSH protege dados transitando de um cliente para o servidor, mas não protege os dados guardados em um banco de dados. SSL é um protocolo on-the-wire.

Uma vez que o atacante ganha acesso direto ao seu banco de dados(desviando do servidor web), os dados armazenados podem ser expostos ou sofre uso nocivo, a não ser que a informação seja protegida pelo banco em si. Criptografa os dados é uma boa maneira de diminuir essa ameaça, mas poucos bancos de dados oferecem esse tipo de criptografia de dados.

A maneira mais fácil de contornar esse problema é primeiro criar seu próprio pacote de criptografia, e então usá-lo no seus scripts PHP. O PHP pode ajudá-lo com várias extensões, tais como Mcrypt e Mhash, cobrindo uma grande variedade de algoritmos de criptografia. O script criptografa os dados antes de inserí-los no banco de dados e descriptografa quando os recupera. Veja as referência para outros exemplos de como criptografia funciona.

No caso de dados realmente escondidos, se sua representação crua não é necessária (ex.: não será mostrada), usar uma função de hash pode ser levada em consideração. Um exemplo bem conhecido disso é guardar o hash MD5 de uma senha no banco de dados ao invés da senha em si. Veja também crypt() e md5().

Exemplo #1 Usando campo de senha hasheado

<?php

// guardando hash da senha
$query  sprintf("INSERT INTO users(name,pwd) VALUES('%s','%s');",
            
pg_escape_string($username), md5($password));
$result pg_query($connection$query);

// consultando se o usuário enviou a senha correta
$query sprintf("SELECT 1 FROM users WHERE name='%s' AND pwd='%s';",
            
pg_escape_string($username), md5($password));
$result pg_query($connection$query);

if (
pg_num_rows($result) > 0) {
    echo 
'Welcome, $username!';
} else {
    echo 
'Authentication failed for $username.';
}

?>