首页 > 编程语言 > 详细

廖雪峰Java10加密与安全-2加密算法-2Base64编码

时间:2019-05-07 21:24:27      阅读:151      评论:0      收藏:0      [点我收藏+]

1.Base64编码

Base64一种把二进制数据用文本表示的编码算法。例如
中有3个字节{\xe4, \xb8, \xad},一共是24位,每6位分组,变成4个字节{39, 0b, 22, 2d},最终结果位5Lit。
如果长度不是3的整数倍:

  • 末尾补0x00或0x00 0x00
    * 编码后加=表示补充了1个字节
    * 编码后加==表示补充了2个字节
    技术分享图片

Base64编码:

  • 一种用文本(A-Z, a-z, 0-9, +/=)表示二进制内容的方式
  • 适于用文本协议
  • 效率下降。原因是2进制文件经过Base64编码,长度会增加1/3。

应用

  • 电子邮件协议。如在电子邮件中上传文件,就可以使用Base64编码,然后以文本的方式传送。

2.示例代码

2.1Base64编码

public class SplitString {
    public static void main(String[] args) throws Exception {
        String original = "Hello\u00ff编码测试";
        byte[] bs = original.getBytes("UTF-8");
        //1.8以后不推荐使用
        String b64_1 = java.util.Base64.getEncoder().encodeToString(bs);
        System.out.println("java.util.Base64编码:"+b64_1);
        String ori_1 = new String(java.util.Base64.getDecoder().decode(b64_1),"UTF-8");
        System.out.println("java.util.Base64解码:"+ori_1);
        System.out.println();

        String b64_2=com.sun.org.apache.xml.internal.security.utils.Base64.encode(bs);
        System.out.println("com.sun.org.apache.xml.internal.security.utils.Base64编码:"+b64_2);
        String ori_2 = new String(com.sun.org.apache.xml.internal.security.utils.Base64.decode(b64_2),"UTF-8");
        System.out.println("com.sun.org.apache.xml.internal.security.utils.Base64解码:"+ori_2);
        System.out.println();

        String b64_3 = com.sun.org.apache.xerces.internal.impl.dv.util.Base64.encode(bs);
        System.out.println("com.sun.org.apache.xerces.internal.impl.dv.util.Base64编码:"+b64_3);
        String ori_3 = new String(com.sun.org.apache.xerces.internal.impl.dv.util.Base64.decode(b64_3),"UTF-8");
        System.out.println("com.sun.org.apache.xerces.internal.impl.dv.util.Base64解码:"+ori_3);
    }
}

技术分享图片

2.2去除末尾的=号

public class SplitString {
    public static void main(String[] args) throws Exception {
        String original = "Hello\u00ff编码测试";
        byte[] bs = original.getBytes("UTF-8");
        //1.8以后不推荐使用
        String b64_1 = java.util.Base64.getEncoder().withoutPadding().encodeToString(bs);
        System.out.println("java.util.Base64编码:"+b64_1);
        String ori_1 = new String(java.util.Base64.getDecoder().decode(b64_1),"UTF-8");
        System.out.println("java.util.Base64解码:"+ori_1);
        System.out.println();
        
    }
}

技术分享图片

2.3Base6的URL编码

标准的Base64编码在URL中会引起冲突。如+,/。通过Base64的URL编码可以将+替换为-,将/替换为_来避免冲突

public class SplitString {
    public static void main(String[] args) throws Exception {
        String original = "Hello\u00ff编码测试";
        byte[] bs = original.getBytes("UTF-8");
        //1.8以后不推荐使用
        String b64_1 = java.util.Base64.getUrlEncoder().withoutPadding().encodeToString(bs);
        System.out.println("java.util.Base64编码:"+b64_1);
        String ori_1 = new String(java.util.Base64.getUrlDecoder().decode(b64_1),"UTF-8");
        System.out.println("java.util.Base64解码:"+ori_1);
        System.out.println();
    }
}

技术分享图片

3.总结:

  • Base64是编码算法,不是加密算法
  • Base64编码的目的是把任意二进制数据编码为文本(代价是长度增加1/3)
  • 其他编码:Base32,Base48,Base58

廖雪峰Java10加密与安全-2加密算法-2Base64编码

原文:https://www.cnblogs.com/csj2018/p/10828146.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!