Desidero crittografare / decodificare i dati nel mio database MySQL memorizzato sul mio server. Uso un hash salato per le mie password. Tutte le crittografie / decifrazioni si sarebbero verificate sul server. Uso gli endpoint PHP a cui i miei clienti remoti accedono. I punti finali poi accedono al database MySQL.
Ho il seguente codice PHP per cifrare / decifrare un messaggio:
<?php
$key = "mySecretKey";
$cipher = "aes-128-gcm";
$ivlen = openssl_cipher_iv_length($cipher);
$iv = openssl_random_pseudo_bytes($ivlen);
$ciphertext = openssl_encrypt("message to be encrypted", $cipher, $key, $options=0, $iv, $tag);
$original_plaintext = openssl_decrypt($ciphertext, $cipher, $key, 0, $iv, $tag);
echo "original message: ".$original_plaintext."\n";
// $iv and $tag change each time we encrypt the data, so store these
?>
... che stavo per utilizzare per memorizzare i dati crittografati nel mio database. Tuttavia, dovrò anche memorizzare $iv
e $tag
con i miei dati poiché queste modifiche sono eseguite per ogni openssl_encrypt
eseguito.
D'altra parte, potrei semplicemente usare le funzioni AES_ENCRYPT
di MySQL. Questa opzione semplificherebbe molto il mio codice, perché posso solo aggiungere AES_ENCRYPT(data, key)
al mio codice SQL.
Tuttavia, ho la sensazione che la soluzione PHP sia più sicura di AES_ENCRYPT
da solo. È vero?
D'altra parte, non ne sono così sicuro. Ad esempio, se qualcuno ha ottenuto la mia chiave AES_ENCRYPT
, allora potrebbero facilmente ottenere il mio PHP $key
nel qual caso sarebbero anche in grado di decrittografare il openssl_encrypt
-ed messge, poiché la% le informazioni di$iv$
e $tag
sarebbero probabilmente così facili da ottenere se hanno in qualche modo messo le mani su $key
.
O forse sto andando sulla mia soluzione PHP nel modo sbagliato. Forse $iv
non dovrebbe essere generato ogni volta che crittografa un'informazione? Forse $iv
dovrebbe essere finale, cioè sempre uguale, nel qual caso $tag
è sempre lo stesso ...