Necesito comparar datos entre una base de datos Oracle y una base de datos MySQL.Encriptación AES en Oracle y MySQL están dando resultados diferentes
En Oracle, los datos se cifran primero con el algoritmo AES-128
y luego se procesan los hash. Lo que significa que no es posible recuperar los datos y descifrarlos.
Los mismos datos están disponibles en MySQL y en texto sin formato. Entonces, para comparar los datos, intenté encriptar y luego mezclar los datos de MySQL mientras seguía los mismos pasos que hice en Oracle.
Después de muchos intentos, finalmente descubrí que el aes_encrypt
en MySQL arroja resultados diferentes a los de Oracle.
-- ORACLE:
-- First the key is hashed with md5 to make it a 128bit key:
raw_key := DBMS_CRYPTO.Hash (UTL_I18N.STRING_TO_RAW ('test_key', 'AL32UTF8'), DBMS_CRYPTO.HASH_MD5);
-- Initialize the encrypted result
encryption_type:= DBMS_CRYPTO.ENCRYPT_AES128 + DBMS_CRYPTO.CHAIN_CBC + DBMS_CRYPTO.PAD_PKCS5;
-- Then the data is being encrypted with AES:
encrypted_result := DBMS_CRYPTO.ENCRYPT(UTL_I18N.STRING_TO_RAW('test-data', 'AL32UTF8'), encryption_type, raw_key);
El resultado para el código de Oracle será: 8FCA326C25C8908446D28884394F2E22
-- MySQL
-- While doing the same with MySQL, I have tried the following:
SELECT hex(aes_encrypt('test-data', MD5('test_key'));
El resultado para el código de MySQL será: DC7ACAC07F04BBE0ECEC6B6934CF79FE
Me estoy perdiendo algo? ¿O los métodos de encriptación entre diferentes idiomas no son los mismos?
ACTUALIZACIÓN: De acuerdo con los comentarios a continuación, creo que debería mencionar el hecho de que el resultado de DBMS_CRYPTO.Hash
en Oracle es el mismo que el resultado devuelto por la función MD5
en MySQL.
También usando CBC
o CBE
en Oracle da el mismo resultado, ya que el IV no se pasa a la función, por lo que el valor predeterminado de la IV se usa que es NULL
BOUNTY: Si alguien puede verificar mi último comentario, y el hecho de que si se utiliza el relleno misma en ambos lados, rendirá mismos resultados obtiene la recompensa:
@rossum el relleno por defecto en MySQL es PKCS7, mmm ... Oh .. En Oracle está usando PK CS5, no puedo creer que no haya notado eso. Gracias. (Por cierto Oracle no tiene la opción PAD_PKCS7, no en al menos 11 g)
A primera vista Sospecho que el problema sea aquí: ' 'test_key', 'AL32UTF8'' Me parece que MySQL tiene un conjunto de caracteres diferente en sus datos y por tanto diferentes de datos antes de aplicar el cifrado. – Johan
Sospecho que el cifrado debe ser el mismo, por lo que me aseguraré de que las claves sean las mismas. es decir, ¿MD5 devuelve cadena hexadecimal o bytes sin procesar. Si es hexadecimal, ¿qué pasa con el caso? Lamentablemente, no tengo acceso a Oracle con DBMS_CRYPTO instalado. – Sodved
@Sodved Sí, el hashing MD5 está dando el mismo resultado en ambas bases de datos, que es '8C32D1183251DF9828F929B935AE0419'. Y dado que ese es el caso de @Johan, no debería ser un problema de codificación ya que el hash MD5 es el mismo – Dan