2016-07-15 318 views
11

Ho del testo crittografato e memorizzato in un db utilizzando PBE AES_256. Inizialmente è stato fatto usando java 1.8.0_65. Dopo l'aggiornamento all'ultima versione di Java, non posso più decodificare questi campi. Ho individuato l'incompatibilità con 1.8.0_71. Le note di rilascio precisano seguente:PBE Crittografia AES_256 incompatibile tra java 8 u65 e u71

Problemi con algoritmi PBE utilizzando AES cripto corretto un errore è stato corretto per PBE utilizzando 256-bit cifrari AES tale che la chiave derivata può essere diverso e non equivalenti ai tasti precedentemente derivati ​​dal la stessa password JDK-8.138.589 (non pubblica)

Così assumere devo migrare tali valori di campo 'manualmente', decifrando con la vecchia versione, memorizzare il valore normale e successivamente ri-cifrare con la versione corrente. C'è un modo migliore per farlo o mi manca forse qualcosa riguardo questa incompatibilità?

Ecco parte del codice che viene utilizzato per la crittografia:

SecretKey keyFromPassword = 
     SecretKeyFactory.getInstance(
      algorithm).generateSecret(
      new PBEKeySpec(password.toCharArray())); 

Cipher cipher = Cipher.getInstance(algorithm); 
cipher.init(Cipher.ENCRYPT_MODE, keyFromPassword, new PBEParameterSpec(
     salt, iterations, new IvParameterSpec(iv))); 
IOUtils.copyLarge(new CipherInputStream(clearStream, cipher), encryptedStream); 

Soluzione sono stato in grado di decifrare i valori esistenti facendo qualche magia riflessione sulla mia cifra e ri-inizializzazione. Ecco il codice se qualcuno è interessato:

Object spi = ReflectionTestUtils.getField(cipher, "spi"); 
ReflectionTestUtils.setField(spi, "keyLength", 128); 
cipher.init(Cipher.DECRYPT_MODE, keyFromPassword, new PBEParameterSpec(
     salt, iterations, new IvParameterSpec(iv))); 
+0

sarebbe meglio se si pubblica la soluzione come risposta – spirit

risposta

4

La migrazione dei valori dei campi suona come un approccio ragionevole.

Guardare il numero actual code change relativo a JDK-8138589 non sembra troppo complicato.

La differenza sembra essere solo la lunghezza della chiave. Pertanto dovresti essere in grado di riprodurre il vecchio valore anche nelle versioni successive alla 1.8.0_71.

Nel caso in cui si rilevi un valore creato con una vecchia versione Java ma ora in esecuzione su una "nuova" versione Java, è possibile eseguirne la migrazione. Viene indicata una migrazione corretta e il campo aggiuntivo che viene salvato.

+0

Grazie. Non sono sicuro di come riprodurre il vecchio valore nella versione 71+. Posso impostare manualmente keyLength nel 'PBEParameterSpec'? – kpentchev

+0

Non hai fornito il codice come crittografato quindi non so quale codice stai usando. Presumo che tu debba generare manualmente la chiave e l'en/decrypt. Vedi [PBES2Core.java] (http://hg.openjdk.java.net/jdk8u/jdk8u/jdk/file/5ea62bb625b6/src/share/classes/com/sun/crypto/provider/PBES2Core.java) per i dettagli. – Robert

+0

Grazie, lo sto già guardando. Fornirò anche uno snippet di codice nella domanda originale. – kpentchev