Java 8中基本和URL Base64编码的区别

12

Java 8 Base64 库有两个变种可以在URI构建中使用:“基本”和“URL和文件名安全”。文档指向RFC 4648表2,作为区别的解释。

阅读规范后,我仍然不清楚这两种编码之间的实际区别是什么:这两种标准是否都被广泛支持?特别是浏览器方面呢?推荐使用URL和文件名安全编码进行数据URI编码吗?已知是否存在支持限制?

2个回答

26

最简单的方法是提供一个例子(我个人认为):

    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安全的,而另一个则不是。

事实上,如果您查看实现,会发现有两个查找表用于编码:toBase64toBase64URL。它们仅有两个不同的字符:

+/用于toBase64,而-_用于toBase64URL

因此,似乎您的问题是是否安全使用其中一个URI?答案是肯定的。


所以假设主要的浏览器都实现了URL安全标准?例如,MDN文档并未指定此内容。 - vinntec
1
@vinntec 我不能确定...但是从实现来看,我会这样假设。 - Eugene
实际上,Chrome无法解释在数据URI中使用URL安全的URL,但可以解释基本的URL。 - vinntec
@Eugene,这是否意味着我可以使用Base64编码器对其进行编码,然后用“-”替换“+”、“_”替换“/”,那么该字符串将与Base64 URL编码器的输出相同?非常感谢! - Hei

1

运行一些测试,使用base64“URL和文件名安全”的编码方式对数据URI进行编码会生成Chrome无法识别的URI。

例如:data:text/plain;base64,TG9yZW0/aXBzdW0=正确解码为Lorem?ipsum,而其URL安全版本data:text/plain;base64,TG9yZW0_aXBzdW0=则不是(ERR_INVALID_URL)。


如果您尝试data:text/plain;base64url,........会怎样呢?虽然我以前从未尝试过,但这似乎是合理的,因为您提供的字符串是base64url编码的,但您告诉Chrome它是base64 - Rafid Muhymin Wafi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接