Java Base64エンコードおよびデコード
1. 概要
このチュートリアルでは、JavaでBase64のエンコードおよびデコード機能を提供するさまざまなユーティリティについて説明します。
主に、ApacheCommonsから提供される新しいJava8APIとユーティリティAPIについて説明します。
参考文献:
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. Stringをbyte配列に変換する
場合によっては、Stringをbyte[]に変換する必要があります。 これを行う最も簡単な方法は、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進数のStringをbyte[]に変換できます。
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.DataTypeConverterとprintHexBinaryおよびparseBase64Binaryです。
コードスニペットはover on GitHub.にあります