【问题标题】:Difference between basic and url base64 encoding in Java 8Java 8 中基本和 url base64 编码之间的区别
【发布时间】:2017-03-29 09:27:39
【问题描述】:

Java 8 Base64 库有两种可用于 URI 构建的变体:“基本”一种和“URL 和文件名安全”。文档指向 RFC 4648 表 2 作为对差异的解释。

阅读规范后,我仍然不清楚这两种编码之间的实际区别是什么:两种标准都“广泛”支持吗?具体来说浏览器呢?是否建议将 URL 和文件名安全编码用于数据 URI 编码?是否存在已知的支持限制?

【问题讨论】:

    标签: java java-8 base64 uri


    【解决方案1】:

    最简单的方法是提供一个例子(恕我直言):

        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 而另一个不是。

    事实上,如果你看一下实现,有两个用于编码的查找表:toBase64toBase64URL。他们只有两个不同的字符:

    +/ 对应于 toBase64,而-_ 对应于toBase64URL

    看来您的问题是一个安全的 URI 并且应该在那里使用?;答案是肯定的。

    【讨论】:

    • 那么假设主流浏览器实现了 URL 安全标准?例如,MDN 文档没有指定这一点。
    • @vinntec 我真的不能说......但我会假设这样看实施。
    • 实际上Chrome在放入数据URI时无法解释安全的URL,但可以解释基本的。
    • @Eugene 这是否意味着我可以使用 base 64 编码器进行编码,然后将 + 替换为 - 和 / 替换为 _ 然后字符串将与 base 64 URL 编码器的输出相同?提前致谢!
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2012-01-21
      • 2014-10-05
      • 2015-09-01
      • 1970-01-01
      • 2011-08-22
      • 2018-02-27
      • 1970-01-01
      • 1970-01-01
      • 2015-10-24
      相关资源
      最近更新 更多