zoukankan      html  css  js  c++  java
  • 廖雪峰Java10加密与安全-2加密算法-2Base64编码

    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 = "Hellou00ff编码测试";
            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去除末尾的=号 ```#java public class SplitString { public static void main(String[] args) throws Exception { String original = "Hellou00ff编码测试"; 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();
    }
    

    }

    <img src="https://img2018.cnblogs.com/blog/1418970/201905/1418970-20190507210306883-1767357485.png" width="500" />
    ###    2.3Base6的URL编码
    标准的Base64编码在URL中会引起冲突。如+,/。通过Base64的URL编码可以将+替换为-,将/替换为_来避免冲突
    ```#java
    public class SplitString {
        public static void main(String[] args) throws Exception {
            String original = "Hellou00ff编码测试";
            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
  • 相关阅读:
    hyperV 虚拟机的创建和内存管理
    诡异~~ASP.NET 程序 无法上传文件 (这个..自己大意造成的嘛~~)
    多线程扫描,多线程采集, ftpscan.NET
    ASP.NET 调试
    Hyperv 如何使用WMI向虚拟计算机附加硬盘
    VS2008SP1显示中文版的智能感知提示信息
    NGIX
    python3的linux环境编译安装
    NGIX之项目布署
    android之自定义ViewGroup和自动换行的布局的实现(支持按钮间隔)
  • 原文地址:https://www.cnblogs.com/csj2018/p/10828146.html
Copyright © 2011-2022 走看看