Java Base64エンコーディングとデコーディング

Java Base64エンコードおよびデコード

1. 概要

このチュートリアルでは、JavaでBase64のエンコードおよびデコード機能を提供するさまざまなユーティリティについて説明します。

主に、ApacheCommonsから提供される新しいJava8APIとユーティリティAPIについて説明します。

参考文献:

Java URLエンコード/デコードのガイド

この記事では、JavaでのURLエンコード、いくつかの落とし穴、およびそれらを回避する方法について説明します。

JavaでのSHA-256およびSHA3-256ハッシュ

JavaでのSHA-256ハッシュの迅速で実用的なガイド

Spring Security 5の新しいパスワードストレージ

Spring Security 5のパスワード暗号化を理解し、より優れた暗号化アルゴリズムに移行するためのクイックガイド。

2. Java 8 for Base 64

java.util.Base64 utility classを介して、標準APIへのJava 8 has finally added Base64 capabilities

基本的なエンコーダプロセスを見てみましょう。

2.1. Java 8 Basic Base64

基本的なエンコーダーは、物事をシンプルに保ち、入力をそのままエンコードします-行分離なし。

出力はA-Za-z0-9+/文字セットの文字セットにマップされ、デコーダーはこのセット外の文字を拒否します。

最初にencode a simple Stringを見てみましょう:

String originalInput = "test input";
String encodedString = Base64.getEncoder().encodeToString(originalInput.getBytes());

単純なgetEncoder()ユーティリティメソッドを介して完全なエンコーダAPIを取得する方法に注意してください。

その文字列をデコードして元の形式に戻しましょう。

byte[] decodedBytes = Base64.getDecoder().decode(encodedString);
String decodedString = new String(decodedBytes);

2.2. パディングなしのJava8Base64エンコーディング

Base64エンコードでは、出力エンコードされたストリングの長さは3の倍数でなければなりません。 そうでない場合、出力には追加のパッド文字(=)が埋め込まれます。

デコード時に、これらの余分なパディング文字は破棄されます。 Base64のパディングをさらに深く掘り下げるには、this detailed answer over on StackOverflowを確認してください。

skip the padding of the outputが必要な場合(おそらく、結果の文字列がデコードされないため)、単にencode without paddingを選択できます。

String encodedString =
  Base64.getEncoder().withoutPadding().encodeToString(originalInput.getBytes());

2.3. Java 8URLエンコード

URLエンコードは、上で見た基本的なエンコーダーに非常に似ています。 URLとファイル名に対して安全なBase64アルファベットを使用し、行区切りを追加しません。

String originalUrl = "https://www.google.co.nz/?gfe_rd=cr&ei=dzbFV&gws_rd=ssl#q=java";
String encodedUrl = Base64.getUrlEncoder().encodeToString(originalURL.getBytes());

デコードはほぼ同じ方法で行われます。getUrlDecoder()ユーティリティメソッドはjava.util.Base64.Decoderを返し、これを使用してURLをデコードします。

byte[] decodedBytes = Base64.getUrlDecoder().decode(encodedUrl);
String decodedUrl = new String(decodedBytes);

2.4. Java 8MIMEエンコーディング

まず、エンコードする基本的なMIME入力を生成することから始めましょう。

private static StringBuilder getMimeBuffer() {
    StringBuilder buffer = new StringBuilder();
    for (int count = 0; count < 10; ++count) {
        buffer.append(UUID.randomUUID().toString());
    }
    return buffer;
}

MIMEエンコーダーは、基本的なアルファベットを使用し、MIMEに適した形式でBase64エンコード出力を生成します。出力の各行は76文字以下で、キャリッジリターンとそれに続く改行( )で終わります。

StringBuilder buffer = getMimeBuffer();
byte[] encodedAsBytes = buffer.toString().getBytes();
String encodedMime = Base64.getMimeEncoder().encodeToString(encodedAsBytes);

getMimeDecoder()ユーティリティメソッドはjava.util.Base64.Decoderを返し、それがデコードプロセスで使用されます。

byte[] decodedBytes = Base64.getMimeDecoder().decode(encodedMime);
String decodedMime = new String(decodedBytes);

3. Encoding/Decoding Using Apache Commons Code

まず、pom.xmlでcommons-codec依存関係を定義する必要があります。


    commons-codec
    commons-codec
    1.10

ライブラリの新しいバージョンがMaven centralでリリースされているかどうかを確認できることに注意してください。

メインAPIはorg.apache.commons.codec.binary.Base64クラスであり、さまざまなコンストラクターでパラメーター化できます。

  • Base64(boolean urlSafe) –URLセーフモードを制御してBase64APIを作成します–オンまたはオフ

  • Base64(int lineLength)–URL安全でないモードでBase64APIを作成し、行の長さを制御します(defaultは76です)

  • ”)

Base64 APIが作成されると、エンコードとデコードの両方が非常に簡単になります。

String originalInput = "test input";
Base64 base64 = new Base64();
String encodedString = new String(base64.encode(originalInput.getBytes()));

Base64クラスのdecode()メソッドは、デコードされた文字列を返します。

String decodedString = new String(base64.decode(encodedString.getBytes()));

別の簡単なオプションは、インスタンスを作成する代わりにusing the static API of Base64です。

String originalInput = "test input";
String encodedString = new String(Base64.encodeBase64(originalInput.getBytes()));
String decodedString = new String(Base64.decodeBase64(encodedString.getBytes()));

4. Stringbyte配列に変換する

場合によっては、Stringbyte[]に変換する必要があります。 これを行う最も簡単な方法は、StringgetBytes()メソッドを使用することです。

String originalInput = "test input";
byte[] result = originalInput.getBytes();

assertEquals(originalInput.length(), result.length);

システムに依存するため、デフォルトのエンコーディングに依存せずに、エンコーディングも提供することをお勧めします。

String originalInput = "test input";
byte[] result = originalInput.getBytes(StandardCharsets.UTF_16);

assertTrue(originalInput.length() < result.length);

文字列がBase64でエンコードされている場合は、the Base64デコーダーを使用できます。

String originalInput = "dGVzdCBpbnB1dA==";
byte[] result = Base64.getDecoder().decode(originalInput);

assertEquals("test input", new String(result));

DatatypeConverter parseBase64Binary()メソッドを使用することもできます。

String originalInput = "dGVzdCBpbnB1dA==";
byte[] result = DatatypeConverter.parseBase64Binary(originalInput);

assertEquals("test input", new String(result));

最後に、DatatypeConverterメソッドを使用して、16進数のStringbyte[]に変換できます。

String originalInput = "7465737420696E707574";
byte[] result = DatatypeConverter.parseHexBinary(originalInput);

assertEquals("test input", new String(result));

5. 結論

この記事では、Java 8で導入された新しいAPIとApache Commonsを使用して、JavaでBase64エンコードおよびデコードを行う方法の基本について説明します。

最後に、同様の機能を提供するために言及する価値のある他のAPIがいくつかあります。たとえば、java.xml.bind.DataTypeConverterprintHexBinaryおよびparseBase64Binaryです。

コードスニペットはover on GitHub.にあります