Java 8 enthält eine eigene Implementierung von Base64 . Ich habe jedoch einen leicht beunruhigenden Unterschied festgestellt. Zur Veranschaulichung werde ich ein Code-Beispiel geben:
Mein Codec-Wrapper:
public interface MyCodec
{
static String apacheDecode(String encodedStr)
{
return new String(Base64.decodeBase64(encodedStr), Charset.forName("UTF-8"));
}
static String apacheEncode(String decodedStr)
{
byte[] decodedByteArr = decodedStr.getBytes(Charset.forName("UTF-8"));
return Base64.encodeBase64String(decodedByteArr);
}
static String javaDecode(String encodedStr)
{
return new String(java.util.Base64.getDecoder().decode(encodedStr), Charset.forName("UTF-8"));
}
static String javaEncode(String decodedStr)
{
byte[] decodedByteArr = decodedStr.getBytes(Charset.forName("UTF-8"));
return java.util.Base64.getEncoder().encodeToString(decodedByteArr);
}
}
Testklasse:
public class CodecDemo
{
public static void main(String[] args)
{
String decodedText = "Hello World!";
String encodedApacheText = MyCodec.apacheEncode(decodedText);
String encodedJavaText = MyCodec.javaEncode(decodedText);
System.out.println("Apache encoded text: " + MyCodec.apacheEncode(encodedApacheText));
System.out.println("Java encoded text: " + MyCodec.javaEncode(encodedJavaText));
System.out.println("Encoded results equal: " + encodedApacheText.equals(encodedJavaText));
System.out.println("Apache decode Java: " + MyCodec.apacheDecode(encodedJavaText));
System.out.println("Java decode Java: " + MyCodec.javaDecode(encodedJavaText));
System.out.println("Apache decode Apache: " + MyCodec.apacheDecode(encodedApacheText));
System.out.println("Java decode Apache: " + MyCodec.javaDecode(encodedApacheText));
}
}
OUTPUT:
Apache encoded text: U0dWc2JHOGdWMjl5YkdRaA0K
Java encoded text: U0dWc2JHOGdWMjl5YkdRaA==
Encoded results equal: false
Apache decode Java: Hello World!
Java decode Java: Hello World!
Apache decode Apache: Hello World!
Exception in thread "main" java.lang.IllegalArgumentException: Illegal base64 character d
at java.util.Base64$Decoder.decode0(Base64.java:714)
at java.util.Base64$Decoder.decode(Base64.java:526)
at java.util.Base64$Decoder.decode(Base64.java:549)
Beachten Sie, dass der Apache-kodierte Text am Ende zusätzliche Zeilenumbrüche (Leerzeichen) enthält. Damit mein Codec unabhängig von der Base64-Implementierung das gleiche Ergebnis liefert, musste ich also trim()
auf den Apache-kodierten Text. In meinem Fall fügte ich einfach den oben erwähnten Methodenaufruf zu meinem Codec hinzu apacheDecode()
wie folgt:
return Base64.encodeBase64String(decodedByteArr).trim();
Nachdem diese Änderung vorgenommen wurde, sind die Ergebnisse so, wie ich sie zu Beginn erwartet hatte:
Apache encoded text: U0dWc2JHOGdWMjl5YkdRaA==
Java encoded text: U0dWc2JHOGdWMjl5YkdRaA==
Encoded results equal: true
Apache decode Java: Hello World!
Java decode Java: Hello World!
Apache decode Apache: Hello World!
Java decode Apache: Hello World!
SCHLUSSFOLGERUNG : Wenn Sie von Apache Base64 zu Java wechseln wollen, müssen Sie dies tun:
- Dekodieren Sie verschlüsselten Text mit Ihrem Apache-Decoder.
- Verschlüsseln Sie den resultierenden (einfachen) Text mit Java.
Wenn Sie umsteigen, ohne diese Schritte zu befolgen, werden Sie höchstwahrscheinlich auf Probleme stoßen. So habe ich diese Entdeckung gemacht.