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.
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
//customize code
function ncrpt($plaintext)
{
$crptK=hash('sha256','4b75ba58da406b');
$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)
VALUES
('".$nome."','".$email."');
");
Codice per la lettura
//customize code
function dcrpt($ciphertext)
{
$crptK=hash('sha256','4b75ba58da406b');
$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 l'hashing e per la verifica
Effettuo l'hashing prima di scrivere su database...
function pswHash($pswIn)
{
$pswOut=password_hash($pswIn, PASSWORD_DEFAULT);
return $pswOut;
}
...ricevo l'input dell'utente via POST attraverso il campo "password" e verifico che sia corretta.
$password=$_POST["password"];
$query = mysqli_query($conn,"
SELECT *
FROM tbl_prova_psw;
");
$data = mysqli_fetch_array($query);
if(password_verify($password, $data["password"]))
{
// password corretta
}
else
{
// password errata
}