• java 加密结果不一致的各个坑


    java 加密结果不一致的各个坑

    1.String的public byte[] getBytes()
    2.转Base64字符串
    3.jdk的版本,jvm运行环境的配置
    4.是否使用第三方加密类
    5.操作系统版本

    1、String的public byte[] getBytes()方法

    此方法作用:使用平台(程序的运行环境)的默认字符集将此String 编码为字节序列,并将结果存储到新的字节数组中
    此方法常用重载方法:public byte[] getBytes(Charset charset),即使用指定的字符集,将String编码为字节序列,并将结果存储到新的字节数组中
    加密中的坑点:在加密中,String.getBytes()是常用方法,如果不指定字符集,此方法将使用平台默认的字符集来进行编码,这样在接口对接中,很可能因为平台默认编码字符集不一致而加密得到不一致的结果,特别是String中带有中文时
    查看平台默认编码集

    System.out.println("默认编码:" + System.getProperty("file.encoding"));
    
    • 1

    可通过IDEA配置JVM编码集

    -Dfile.encoding=GBK
    
    • 1

    验证效果如图(当前默认编码集为UTF-8)
    在这里插入图片描述
    配置idea默认编码集
    在这里插入图片描述
    在这里插入图片描述
    由以上运行结果可以发现,对于英文来说GBK,UTF-8编码结果是一致的,但是中文编码结果不一致

    2、Base64编码

    参考资料:
    1.什么是Base64?
    2.Base64编码出现换行符
    3.Base64百度百科

    Base64是一种字符串编码格式,能将任意Binary资料用64种(可打印字符)字元组合(A-Z、a-z、0-9、+、/(还有补位符=)。
    Base64的编码规则(RFC822规定):
    1.把每三个8Bit的字节转换为四个6Bit的字节,原字节数非3倍数,先转6bit,剩余用=补齐(可参照百度百科)
    2.每76个字符需要加上一个回车换行
    3.最后的结束符也要处理
    加密中的坑点:坑点其实就是编码规则中的第二条,每76个字符需要加上一个回车换行,但是不是所有的编码包都遵循这个规范

    import sun.misc.BASE64Decoder;
    import sun.misc.BASE64Encoder;
    
    import java.io.IOException;
    import java.util.Base64;
    
    public class test {
        public static void main(String[] args) throws IOException {
            System.out.println("默认编码:" + System.getProperty("file.encoding"));
            String englishText = "LisaLisaLisaLisaLisaLisaLisaLisaLisaLisaLisaLisaLisaLisaLisaLisaLisaLisaLisaLisaLisaLisaLisaLisaLisaLisaLisaLisaLisaLisa";
            String chineseText = "李四";
    
            //1.jdk rt.jar自带的sun.misc.BASE64Encoder
            String s = new BASE64Encoder().encodeBuffer(englishText.getBytes());
            String r = new String(new BASE64Decoder().decodeBuffer(s));
    
            //2.jdk rt.jar自带的java.util.Base64
            String s1 = Base64.getEncoder().encodeToString(englishText.getBytes());
            String r1 = new String(Base64.getDecoder().decode(s1));
    
            //3.Apache Commons Codec
            String s2 = org.apache.commons.codec.binary.Base64.encodeBase64String(englishText.getBytes());
            String r2 = new String(org.apache.commons.codec.binary.Base64.decodeBase64(s2));
    
            System.out.println("------------------------------------");
            System.out.println("sun.misc.BASE64Encoder加密:\n"+s);
            System.out.println("sun.misc.BASE64Decoder解密:\n"+r);
            System.out.println("------------------------------------");
    
            System.out.println("java.util.Base64加密:\n"+s1);
            System.out.println("java.util.Base64解密:\n"+r1);
            System.out.println("------------------------------------");
    
            System.out.println("org.apache.commons.codec.binary.Base64加密:\n"+s2);
            System.out.println("org.apache.commons.codec.binary.Base64解密:\n"+r2);
            System.out.println("------------------------------------");
    
    
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41

    运行结果如下:

    在这里插入图片描述
    由以上运行结果可以发现,

    1. sun.misc.BASE64Encoder加密,每76个字符会加上回车换行,末尾也会加上回车换行
    2. java.util.Base64和org.apache.commons.codec.binary.Base64运行结果是一致的,不包含回车换行
      经过测试 java.util.Base64解析sun.misc.BASE64Encoder会解析失败,所以使用org.apache.commons.codec.binary.Base64来转Base64为佳,不用担心效率问题以及编码包之间的差异
  • 相关阅读:
    蔚来、小鹏、吉利走到了跨界分叉口
    spring框架
    uniapp实现图片上传——支持APP、微信小程序
    【好玩】如何在github主页放一条贪吃蛇
    善于使用二阶思维
    Android布局优化(上)
    nuc980学习笔记6 - 手把手教 源码编译和YAFFS2文件系统制作
    yarn的安装及使用
    经典OJ题:链表中的倒数第K个节点
    思科防火墙解析(ASA)
  • 原文地址:https://blog.csdn.net/CSDNLYFc/article/details/126319054