Deseo cifrar / descifrar datos en mi base de datos MySQL almacenada en mi servidor. Yo uso un hash salado para mis contraseñas. Todo el cifrado / descifrado se produciría en el servidor. Utilizo los puntos finales de PHP a los que acceden mis clientes remotos. Los puntos finales luego acceden a la base de datos MySQL.
Tengo el siguiente código PHP para cifrar / descifrar un mensaje:
<?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
?>
... que iba a utilizar para almacenar datos cifrados en mi base de datos. Sin embargo, también necesitaré almacenar $iv
y $tag
con mis datos, ya que estos cambios para cada openssl_encrypt
ejecutado.
Por otro lado, podría usar las funciones AES_ENCRYPT
de MySQL. Esta opción simplificaría mucho mi código, porque solo puedo agregar AES_ENCRYPT(data, key)
a mi código SQL.
Sin embargo, tengo la sensación de que la solución PHP es más segura que solo AES_ENCRYPT
. ¿Es esto cierto?
Por otro lado, no estoy tan seguro. Por ejemplo, si alguien se apoderó de mi clave AES_ENCRYPT
, entonces también podría apoderarse de mi% $key
en PHP, en cuyo caso también podrían descifrar el mensaje openssl_encrypt
-ed messge, ya que% La información de $iv$
y $tag
probablemente sería tan fácil de obtener si tienen en sus manos el $key
de alguna manera.
O tal vez me dirijo a mi solución de PHP por el camino equivocado. ¿Tal vez no se debe generar $iv
cada vez que encripta una información? Tal vez $iv
debería ser final, es decir, siempre el mismo, en cuyo caso $tag
siempre es el mismo ...