Estoy usando un script PHP para encriptar cadenas usando el cifrado "aes-256-cbc". Esas cadenas se almacenan en una base de datos MySQL y me gustaría que MySQL las descifre.
Aquí está mi función de cifrado PHP:
function encrypt($token) { if($token !== "" && $token !== null && $token !== false) { $cipher_method = 'aes-256-cbc'; $iv = "98awg9X7SiI3jxp3"; $enc_key = hash("sha256", "Pn6nK7Gs9r"); $crypted_token = openssl_encrypt($token, $cipher_method, $enc_key, 0, $iv); return $crypted_token; } return $token; } echo hash("sha256", "Pn6nK7Gs9r"); // output 67fa26a5570901994ef1eae105b9286fca44b6f79e200a9fbbd5cff897c3a7ce echo encrypt("test"); // output Xq1CcrpteSqcybePun+6pQ==Aquí está mi secuencia de comandos MySQL:
SET block_encryption_mode = 'aes-256-cbc'; SET @key_str = SHA2('Pn6nK7Gs9r',256); SET @init_vector = "98awg9X7SiI3jxp3"; SET @encrypted = "Xq1CcrpteSqcybePun+6pQ=="; SELECT @key_str; # output 67fa26a5570901994ef1eae105b9286fca44b6f79e200a9fbbd5cff897c3a7ce SELECT AES_DECRYPT(@encrypted,@key_str,@init_vector); # output NULL SELECT cast(AES_DECRYPT(@encrypted,@key_str,@init_vector) as char(100)); # output NULL SELECT AES_DECRYPT(cast(@encrypted as BINARY),@key_str,@init_vector); # output NULL SELECT cast(AES_DECRYPT(cast(@encrypted as BINARY),@key_str,@init_vector) as char(100)); # output NULLComo puede ver, siempre da NULL. (resultado esperado: prueba). Probé otras cosas:
SET block_encryption_mode = 'aes-256-cbc'; SET @key_str = SHA2('Pn6nK7Gs9r',256); SET @init_vector = "98awg9X7SiI3jxp3"; SET @string = "test"; SELECT AES_ENCRYPT(@string,@key_str,@init_vector); # output [BLOB - 16 B] SELECT cast(AES_ENCRYPT(@string,@key_str,@init_vector) as char(100)); # output empty valueHabría esperado que AES_ENCRYPT devolviera una cadena cifrada (Xq1CcrpteSqcybePun+6pQ==). Qué estoy haciendo mal ?
Gracias de antemano por tu ayuda.
Primero, cuando calcula el hash, debe recuperar el valor binario para obtener exactamente 256 bits. Para hacer eso en PHP, pase true a hash() .
<?php function encrypt($token) { $cipher_method = 'aes-256-cbc'; $iv = '98awg9X7SiI3jxp3'; $key = hash('sha256', 'Pn6nK7Gs9r', true); $crypted_token = openssl_encrypt($token, $cipher_method, $key, 0, $iv); return $crypted_token; } echo encrypt('test'); ?>Producción:
5EMRiQCvOjQjNSlwpYKyfQ==Tenga en cuenta que el resultado está codificado en Base64.
En MySQL, para obtener el valor binario del hash, use UNHEX() . Para decodificar la cadena Base64, use FROM_BASE64() .
SET block_encryption_mode = 'aes-256-cbc'; SET @key = UNHEX(SHA2('Pn6nK7Gs9r',256)); SET @iv = '98awg9X7SiI3jxp3'; SET @ciphertext = FROM_BASE64('5EMRiQCvOjQjNSlwpYKyfQ=='); SELECT AES_DECRYPT(@ciphertext, @key, @iv);Producción:
testCAST(AES_ENCRYPT(....) AS CHAR) es el problema. AES_ENCRYPT devuelve datos "binarios", no fechas de "caracteres".
Xq1CcrpteSqcybePun+6pQ== parece generar la salida de TO_BASE64(...) .