2016-07-15 10 views
11

Ich habe einige Text verschlüsselt und in einem db mit PBE AES_256 gespeichert. Dies wurde zunächst mit Java 1.8.0_65 gemacht. Nach dem Upgrade auf das neueste Java kann ich diese Felder nicht mehr entschlüsseln. Ich habe die Inkompatibilität auf 1.8.0_71 lokalisiert. Die Release-Informationen angeben, die folgenden:PBE AES_256 Verschlüsselung inkompatibel zwischen Java 8 u65 und U71

Problem PBE Algorithmen AES Krypto korrigiert einen Fehler für PBE korrigiert wurde unter Verwendung von 256-Bit-AES-Chiffren, so daß der abgeleitete Schlüssel verschieden sein können und nicht gleich Schlüssel zuvor von abgeleiteten das gleiche Passwort. JDK-8.138.589 (nicht öffentlich)

Also gehe ich davon brauche ich diese Feldwerte ‚manuell‘ migrieren, indem sie mit der alten Version zu entschlüsseln, die Ebene Wert zu speichern und anschließend wieder verschlüsselt mit der aktuellen Version. Gibt es einen besseren Weg, oder verpasse ich vielleicht etwas in Bezug auf diese Inkompatibilität?

Hier ist ein Teil des Codes, der für die Verschlüsselung verwendet wird:

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

Lösung Ich war in der Lage, die vorhandenen Werte zu entschlüsseln, indem einige Überlegungen Magie auf meiner Chiffre und Reinitialisierung es zu tun. Hier ist der Code, wenn jemand interessiert ist:

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

es wäre besser, wenn Sie Ihre Lösung als Antwort – spirit

Antwort

4

Migration der Feldwerte klingt wie ein vernünftiger Ansatz.

Blick auf die actual code change bezogen auf JDK-8138589 sieht nicht zu kompliziert.

Der Unterschied scheint nur die Schlüssellänge zu sein. Daher sollten Sie den alten Wert auch für Versionen nach 1.8.0_71 reproduzieren können.

Falls Sie einen Wert entdecken, der mit einer alten Java-Version erstellt wurde, aber jetzt auf einer "neuen" Java-Version läuft, können Sie ihn migrieren. Eine erfolgreiche Migration wird durch ein zusätzliches Feld angezeigt, das gespeichert wird.

+0

Vielen Dank. Ich bin nicht sicher, wie man den alten Wert auf Version 71+ reproduziert. Kann ich die keyLength in 'PBEParameterSpec' manuell einstellen? – kpentchev

+0

Sie haben den Code nicht zur Verfügung gestellt, wie Sie verschlüsseln, daher weiß ich nicht, welchen Code Sie verwenden. Ich nehme an, dass Sie den Schlüssel und das en/decrypt manuell erzeugen müssen. Details siehe [PBES2Core.java] (http://hg.openjdk.java.net/jdk8u/jdk8u/jdk/file/5ea62bb625b6/src/share/classes/com/sun/crypto/provider/PBES2Core.java). – Robert

+0

Danke, ich sehe es mir schon an. Ich werde auch ein Code-Snippet in der ursprünglichen Frage bereitstellen. – kpentchev