{"id":1683,"date":"2013-02-01T15:10:49","date_gmt":"2013-02-01T13:10:49","guid":{"rendered":"http:\/\/www.tutego.de\/blog\/javainsel\/?p=1683"},"modified":"2013-02-01T15:10:49","modified_gmt":"2013-02-01T13:10:49","slug":"base64-kodierung-unter-java-8","status":"publish","type":"post","link":"https:\/\/www.tutego.de\/blog\/javainsel\/2013\/02\/base64-kodierung-unter-java-8\/","title":{"rendered":"Base64-Kodierung (unter Java 8)"},"content":{"rendered":"<p>F\u00fcr die \u00dcbertragung von Bin\u00e4rdaten hat sich im Internet die Base64-Kodierung durchgesetzt, die zum Beispiel bei E-Mail-Anh\u00e4ngen und SOAP-Nachrichten zu finden ist. Auch bei der HTTP-Authentifizierung Basic Authentication kommt Base64 zum Tragen, denn die Konkatenation von Benutzername + \u201e:\u201c + Passwort wird \u00fcber Base64 codiert und so zum Server gesendet \u2013 der Sicherheitsgewinn ist nat\u00fcrlich null.<\/p>\n<p>Die Base64-Kodierung wird im RFC 4648[1] beschriebene. Drei Bytes (24 Bit) werden in vier Base64-kodierte Zeichen (vier Zeichen mit jeweils sechs repr\u00e4sentativen Bits) umgesetzt. Die Konsequenz dieser Umformung ist, dass Bin\u00e4rdaten rund 33&#160; % gr\u00f6\u00dfer werden. Die Base64-Zeichen bestehen aus den Buchstaben des lateinischen Alphabets, den Ziffern 0 bis 9 sowie (im Normalfall) \u00bb+\u00ab, \u00bb\/\u00ab und \u00bb=\u00ab.<\/p>\n<p>Das JDK liefert seit Java 8 direkte Unterst\u00fctzung f\u00fcr diese Base64-Umsetzung mit der Klasse java.util.BASE64 aus. Zwei inneren Klassen Base64.Decoder bzw. Base64.Encoder k\u00fcmmern sich um die Umwandlung. Zur Erzeugung der Exemplare gibt es statische Methoden in BASE64, und zwar nicht nur zwei, sieben. Der Grund ist, dass es neben der Standard-Konvertierung \u201eBase\u201c noch MIME und URL\/Dateiname-sicher gibt:<\/p>\n<p>\u00b7 getEncoder() und getDecoder() liefern Exemplare vom Typ Base64.Encoder und Base64.Decoder bzw. f\u00fcr den normalen Basic-Typ.<\/p>\n<p>\u00b7 getEncoder(int lineLength, byte[] lineSeparator), getMimeEncoder() und getMimeDecoder() liefern Encoder\/Decoder f\u00fcr MIME-Nachrichten, bei der Zeilen mit einem \u201e\\r\u201c getrennt sind.<\/p>\n<p>\u00b7 getUrlEncoder() und getUrlDecoder() nutzt zur Kodierung nur Zeichen, die f\u00fcr URL und Dateinamen g\u00fcltig sind, und ersetzt \u201e+\u201c durch \u201e-\u201c und \u201e\/\u201c durch \u201e_\u201c.<\/p>\n<p>Beispiel<\/p>\n<p>Das folgende Beispiel erzeugt zuerst ein Byte-Feld mit Zufallszahlen. Die Base64-Klasse kodiert das Byte-Feld in einen String, der auf dem Bildschirm ausgegeben wird. Nachdem der String wieder zur\u00fcckkodiert wurde, werden die Byte-Felder verglichen und liefern nat\u00fcrlich true:<\/p>\n<p>byte[] bytes1 = SecureRandom.getSeed( 20 );<\/p>\n<p>\/\/ byte[] -&gt; String<\/p>\n<p>String s = Base64.getEncoder().encodeToString( bytes1 );<\/p>\n<p>System.out.println( s ); \/\/ z.B. TVST9v+JMk\/vVUOSENmIcriXFLo=<\/p>\n<p>\/\/ String -&gt; byte[]<\/p>\n<p>byte[] bytes2 = Base64.getDecoder().decode( s );<\/p>\n<p>System.out.println( Arrays.equals(bytes1, bytes2) ); \/\/ true<\/p>\n<p>Wer nicht mit Java 8 arbeiten kann, aber mit \u00e4lteren Versionen vom Oracle JDK, der kann BASE64Encoder\/BASE64Decoder aus dem nicht-\u00f6ffentlichen Paket sun.misc nutzen.[2] Wem das nicht ganz geheuer ist, der kann javax.mail.internet.MimeUtility von der JavaMail-API nutzen[3] oder unter http:\/\/jakarta.apache.org\/commons\/codec\/ die Commons Codec-Bibliothek beziehen.<\/p>\n<hr size=\"1\" width=\"33%\" \/>\n<p>[1] http:\/\/tools.ietf.org\/html\/rfc4648<\/p>\n<p>[2] Siehe dazu http:\/\/java.sun.com\/products\/jdk\/faq\/faq-sun-packages.html. Bisher existieren sie aber seit \u00fcber zehn Jahren, und wer Oracles Philosophie kennt, der wei\u00df, dass die Abw\u00e4rtskompatibilit\u00e4t oberste Priorit\u00e4t hat.<\/p>\n<p>[3] http:\/\/www.rgagnon.com\/javadetails\/java-0598.html gibt ein Beispiel. Die JavaMail-API ist Teil von Java EE 5 und muss sonst f\u00fcr das Java SE als Bibliothek hinzugenommen werden.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>F\u00fcr die \u00dcbertragung von Bin\u00e4rdaten hat sich im Internet die Base64-Kodierung durchgesetzt, die zum Beispiel bei E-Mail-Anh\u00e4ngen und SOAP-Nachrichten zu finden ist. Auch bei der HTTP-Authentifizierung Basic Authentication kommt Base64 zum Tragen, denn die Konkatenation von Benutzername + \u201e:\u201c + Passwort wird \u00fcber Base64 codiert und so zum Server gesendet \u2013 der Sicherheitsgewinn ist nat\u00fcrlich [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":"","_links_to":"","_links_to_target":""},"categories":[11,66],"tags":[],"class_list":["post-1683","post","type-post","status-publish","format-standard","hentry","category-insel","category-java-8"],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/posts\/1683","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/comments?post=1683"}],"version-history":[{"count":0,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/posts\/1683\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/media?parent=1683"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/categories?post=1683"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/tags?post=1683"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}