Cómo usar AES_ENCRYPT y AES_DECRYPT en mysql

Creé una tabla de usuarios

CREATE TABLE `user` ( `id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT , `first_name` VARBINARY(100) NULL , `address` VARBINARY(200) NOT NULL , PRIMARY KEY (`id`)) ENGINE = InnoDB DEFAULT CHARACTER SET = utf8 COLLATE = utf8_general_ci; 

Inserté una fila:

 INSERT into user (first_name, address) VALUES (AES_ENCRYPT('Obama', 'usa2010'),AES_ENCRYPT('Obama', 'usa2010')); 

Para seleccionar esta fila, utilicé:

 SELECT AES_DECRYPT(first_name, 'usa2010'), AES_DECRYPT(address, 'usa2010') from user; 

Obtengo el siguiente resultado. Qué debo ver para ver mis datos. No hay datos visibles para mí.

No puedo ver mis datos

De acuerdo con el Manual:

AES_ENCRYPT () cifra una cadena y devuelve una cadena binaria. AES_DECRYPT () descifra la cadena encriptada y devuelve la cadena original .

  • MySQL 5.1 Doc: AES_ENCRYPT () / AES_DECRYPT ()

No sé por qué todavía está devolviendo una cadena binaria en su caso. De todos modos, prueba esto:

 SELECT *, CAST(AES_DECRYPT(first_name, 'usa2010') AS CHAR(50)) first_name_decrypt FROM user 

Y use first_name_decrypt lugar de first_name .

Desde el cliente de línea de comandos de mysql, no hay necesidad de usar CAST:

 mysql> SELECT AES_DECRYPT(AES_ENCRYPT('admin','abc'),'abc'); 

+-----------------------------------------------+ | AES_DECRYPT(AES_ENCRYPT('admin','abc'),'abc') | +-----------------------------------------------+ | admin | +-----------------------------------------------+ 1 row in set (0.00 sec)

 mysql> SELECT CAST(AES_DECRYPT(AES_ENCRYPT('admin','abc'),'abc') AS CHAR (50)); 

+------------------------------------------------------------------+ | CAST(AES_DECRYPT(AES_ENCRYPT('admin','abc'),'abc') AS CHAR (50)) | +------------------------------------------------------------------+ | admin | +------------------------------------------------------------------+ 1 row in set (0.02 sec)

Como puede ver, usar el molde en la línea de comando es un poco más lento. Pero he notado que si usa algunas herramientas como phpmyadmin, entonces necesita usar CAST, de lo contrario el resultado será incorrecto.

 if (isset($_POST['user_name']) and isset($_POST['user_password'])){ $user_name = $_POST['user_name']; $user_password = $_POST['user_password']; $query = "SELECT * FROM `user_tbl` WHERE user_name='$user_name' and AES_DECRYPT(user_password , '@ert') = '$user_password'"; $result = mysqli_query($connection, $query) or die(mysqli_error($connection)); $count = mysqli_num_rows($result);