Pregunta

Recientemente hice una pregunta sobre Oracle Encryption.En el camino para encontrar una solución para mí, decidí mover el cifrado (bueno, la ofuscación) al lado de la aplicación para ciertas tareas.

Mi problema es que la base de datos ya está cifrando datos de cierta manera y necesito código Java para duplicar esa funcionalidad, de modo que el texto cifrado por un sistema pueda ser descifrado por el otro y viceversa.

Quiero que el cifrado sea compatible con lo que la base de datos ya estaba haciendo, pero no pude encontrar la documentación que describa exactamente lo que está haciendo Oracle.¿Cómo replico esto en Java?

dbms_obfuscation_toolkit.DESEncrypt(
  input_string => v_string,
  key_string => key_string,
  encrypted_string => encrypted_string );
RETURN UTL_RAW.CAST_TO_RAW(encrypted_string);

No importa lo que intente, parece que el cifrado DES de Java es diferente al de Oracle.

¿Fue útil?

Solución

Encontré que esto funciona:

KeySpec ks = new DESKeySpec(new byte[] {'s','e','c','r','e','t','!','!'});
SecretKeyFactory skf = SecretKeyFactory.getInstance("DES");
SecretKey sk = skf.generateSecret(ks);
Cipher c = Cipher.getInstance("DES/CBC/NoPadding");
IvParameterSpec ips = new IvParameterSpec(new byte[] {0,0,0,0,0,0,0,0});
c.init(Cipher.ENCRYPT, sk, ips);
// or
c.init(Cipher.DECRYPT, sk, ips);

La pieza que faltaba era el Vector de Inicialización (ips) que debe ser de 8 ceros.Cuando usas null en Java obtienes algo diferente.

Otros consejos

Usar Java en la base de datos habría sido otro enfoque que (¡debería!) Habría garantizado que el código (y por lo tanto los resultados) serían idénticos.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top