Domanda

Di recente ho posto una domanda su Oracle Encryption. Lungo la strada per trovare una soluzione per me stesso ho deciso di spostare la crittografia (bene, offuscamento) sul lato dell'applicazione per determinati compiti.

Il mio problema è che il database sta già crittografando i dati in un certo modo e ho bisogno del codice Java per duplicare quella funzionalità, in modo che il testo crittografato da un sistema possa essere decrittografato dall'altro e viceversa.

Voglio che la crittografia sia compatibile con ciò che il DB stava già facendo, ma non sono riuscito a trovare la documentazione che descrive esattamente ciò che Oracle sta facendo. Come posso replicare questo in 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);

Indipendentemente da ciò che provo, sembra che la crittografia DES Java sia diversa da quella di Oracle.

È stato utile?

Soluzione

Ho trovato che funziona:

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);

Il pezzo mancante era il vettore di inizializzazione (ips) che deve essere di 8 zeri. Quando usi null in Java ottieni qualcosa di diverso.

Altri suggerimenti

L'uso di Java nel database sarebbe stato un altro approccio che avrebbe (dovrebbe!) garantito che il codice (e quindi i risultati) sarebbero stati identici.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top