AS
PHP
Secure Storing of Sensitive Data
Il salvataggio dei dati sensibili su database richiede naturalmente particolari accortezze. A parte l'ovvia protezione con username e password del database, la prima cosa da fare è predisporre un sistema per criptare i dati al salvataggio ed un corrispondente sistema per decriptarli nel momento in cui debbano essere letti.
Un differente approccio viene normalmente usato per le password, per le quali l'esigenza di essere lette in realtà non esiste ma l'unica attività necessaria dopo il loro inserimento è il confronto con l'input dell'utente. Tale procedimento di criptatura irreversibile prende il nome di hashing. In questa pagina applico entrambe le tecniche utilizzando il PHP.
Su database remoto ho predisposto la tabella di test "tbl_prova_user" con i seguenti campi: "nome", "email" e "password". Attraverso la seguente simulazione è possibile salvare un recordset, visualizzare l'effettivo contenuto della tabella e recuperare in modo utile le informazioni.
Per maggiore chiarezza ho predisposto i due esempi in modo separato, pur insistendo sulla medesima tabella. Nel primo esempio cripto e decripto il campo "email", lasciando in chiaro gli altri due. Nel secondo applico la procedura dell'hashing al campo "password" e lascio in chiaro gli altri.
Per evitare l'inutile proliferare dei dati, prima di ogni nuova scrittura i vecchi dati vengono cancellati. Riporto inoltre solamente il codice attinente alla presente trattazione, tralasciando quanto spiegato in altre pagine del sito.
Encrypting dei dati sensibili
Scrivi un recordset. Il campo "email" viene criptato.
Visualizza il contenuto effettivo della tabella
Aggiorna
Leggi il recordset. Il campo "email" viene decriptato.
Aggiorna
Codice per la scrittura.
$crptK=hash('sha256','4b75ba58da406b');//customize code
function ncrpt($plaintext)
{
$cipher = "aes-128-ctr";
if (in_array($cipher, openssl_get_cipher_methods()))
{
$iv = substr(hash('sha256','123456'),0,16);//customize code
$ciphertext = openssl_encrypt($plaintext, $cipher, $crptK, 0, $iv);
return $ciphertext;
}
}
$email=ncrpt($email);
mysqli_query($conn, "INSERT INTO tbl_prova_user
(nome, email, password)
VALUES
('".$nome."','".$email."','".$password."');
");
Codice per la lettura.
$crptK=hash('sha256','4b75ba58da406b');//customize code
function dcrpt($ciphertext)
{
$cipher = "aes-128-ctr";
if (in_array($cipher, openssl_get_cipher_methods()))
{
$iv = substr(hash('sha256','123456'),0,16);//customize code
$plaintext = openssl_decrypt($ciphertext, $cipher, $crptK, 0, $iv);
return $plaintext;
}
}
$query = mysqli_query($conn,"
SELECT *
FROM tbl_prova_user;
");
while($row = mysqli_fetch_array($query, MYSQLI_ASSOC))
{
$email=dcrpt($row["email"]);
echo "".$row["nome"]."".$email."".$row["password"]."";
}
Hashing di una password
Scrivi un recordset. Il campo "password" viene criptato.
Visualizza il contenuto effettivo della tabella.
Aggiorna
Verifica la corrispondenza della password.
Codice per la verifica. In questo caso ricevo l'input dell'utente via POST attraverso il campo "password".
$password=$_POST["password"];
$query = mysqli_query($conn,"
SELECT *
FROM tbl_prova_user;
");
$data = mysqli_fetch_array($query);
if(password_verify($password,$data["password"]))
{
// password corretta
}
else
{
// password errata
}