web-dev-qa-db-ja.com

Java 8での基本とURLのbase64エンコーディングの違い

Java 8 Base64 ライブラリには、URIの構築に使用できる2つのバリアントがあります:「基本」のものと「URLおよびファイル名セーフ」です。 RFC 4648 違いの説明としての表2。

仕様を読んだ後でも、両方のエンコーディングの実際的な違いはまだはっきりしていません。どちらの規格も「広く」サポートされていますか?特にブラウザはどうですか?データURIエンコーディングには、URLとファイル名の安全なエンコーディングが推奨されますか?既知のサポート制限はありますか?

9
vinntec

最も簡単な方法は、例(IMHO)を提供することです:

    Base64.Encoder enc = Base64.getEncoder();
    Base64.Encoder encURL = Base64.getUrlEncoder();

    byte[] bytes = enc.encode("subjects?_d".getBytes());
    byte[] bytesURL = encURL.encode("subjects?_d".getBytes());

    System.out.println(new String(bytes)); // c3ViamVjdHM/X2Q=      notice the "/"
    System.out.println(new String(bytesURL)); // c3ViamVjdHM_X2Q=   notice the "_"

    Base64.Decoder dec = Base64.getDecoder();
    Base64.Decoder decURL = Base64.getUrlDecoder();

    byte[] decodedURL = decURL.decode(bytesURL);
    byte[] decoded = dec.decode(bytes);

    System.out.println(new String(decodedURL));
    System.out.println(new String(decoded));

一方がURL safeで、もう一方がそうでないことに注意してください。

実際、実装を見ると、エンコードに使用される2つのルックアップテーブルがあります:toBase64toBase64URL。異なるのは2つの文字だけです。

+/およびtoBase64と、-_およびtoBase64URLの比較。

だからあなたの質問1つのURIは安全であり、そこで使用する必要がありますか?;答えはイエスです。

16
Eugene

いくつかのテストを実行し、base64の「URLとファイル名セーフ」を使用してデータURIをエンコードすると、Chromeで認識されないURIが生成されます。

例:data:text/plain;base64,TG9yZW0/aXBzdW0=Lorem?ipsumに正しくデコードされますが、URLセーフな対応物data:text/plain;base64,TG9yZW0_aXBzdW0=はそうではありません(ERR_INVALID_URL)。

1
vinntec