zoukankan      html  css  js  c++  java
  • java中sha1.md5,base64到底怎么回事

    MD5

    Message Digest Algorithm MD5(中文名为消息摘要算法第五版)为计算机安全领域广泛使用的一种散列函数,用以提供消息的完整性保护。MD5用的是哈希函数,在计算机网络中应用较多的不可逆加密算法有RSA公司发明的MD5算法和由美国国家技术标准研究所建议的安全散列算法SHA。

    //MD5摘要后转大写   
    String str0 = DigestUtils.md5Hex("abc").toUpperCase();  
    System.out.println(str0);
    

    SHA1

    安全哈希算法(Secure Hash Algorithm)主要适用于数字签名标准(Digital Signature Standard DSS)里面定义的数字签名算法(Digital Signature Algorithm DSA)。对于长度小于2^64位的消息,SHA1会产生一个160位的消息摘要。当接收到消息的时候,这个消息摘要可以用来验证数据的完整性。在传输的过程中,数据很可能会发生变化,那么这时候就会产生不同的消息摘要。 SHA1有如下特性:不可以从消息摘要中复原信息;两个不同的消息不会产生同样的消息摘要。

    • 实现一
    //这个方法已经过期
    String sha1 = DigestUtils.shaHex(bytes);
    
    //使用这个方法
    String sha1 = DigestUtils.sha1Hex(bytes);
    System.out.println(sha1);
    
    • 实现二
    /**
         * sha1加密
         * @param data
         * @return
         * @throws NoSuchAlgorithmException 
         */
        public static String sha1(String data) throws NoSuchAlgorithmException {
            //加盐   更安全一些
            data += "lyz";
            //信息摘要器                                算法名称
            MessageDigest md = MessageDigest.getInstance("SHA1");
            //把字符串转为字节数组
            byte[] b = data.getBytes();
            //使用指定的字节来更新我们的摘要
            md.update(b);
            //获取密文  (完成摘要计算)
            byte[] b2 = md.digest();
            //获取计算的长度
            int len = b2.length;
            //16进制字符串
            String str = "0123456789abcdef";
            //把字符串转为字符串数组
            char[] ch = str.toCharArray();
            
            //创建一个40位长度的字节数组
            char[] chs = new char[len*2];
            //循环20次
            for(int i=0,k=0;i<len;i++) {
                byte b3 = b2[i];//获取摘要计算后的字节数组中的每个字节
                // >>>:无符号右移  
                // &:按位与
                //0xf:0-15的数字
                chs[k++] = ch[b3 >>> 4 & 0xf];
                chs[k++] = ch[b3 & 0xf];
            }
            
            //字符数组转为字符串
            return new String(chs);
        }
    

    Base64

    编码可用于在HTTP环境下传递较长的标识信息。例如,在Java Persistence系统Hibernate中,就采用了Base64来将一个较长的唯一标识符(一般为128-bit的UUID)编码为一个字符串,用作HTTP表单和HTTP GET URL中的参数。在其他应用程序中,也常常需要把二进制数据编码为适合放在URL(包括隐藏表单域)中的形式。此时,采用Base64编码不仅比较简短,同时也具有不可读性,即所编码的数据不会被人用肉眼所直接看到。
      然而,标准的Base64并不适合直接放在URL里传输,因为URL编码器会把标准Base64中的“/”和“+”字符变为形如“%XX”的形式,而这些“%”号在存入数据库时还需要再进行转换,因为ANSI SQL中已将“%”号用作通配符。
      为解决此问题,可采用一种用于URL的改进Base64编码,它不在末尾填充'='号,并将标准Base64中的“+”和“/”分别改成了“”和“-”,这样就免去了在URL编解码和数据库存储时所要作的转换,避免了编码信息长度在此过程中的增加,并统一了数据库、表单等处对象标识符的格式。
      另有一种用于正则表达式的改进Base64变种,它将“+”和“/”改成了“!”和“-”,因为“+”,“
    ”以及前面在IRCu中用到的“[”和“]”在正则表达式中都可能具有特殊含义。
      此外还有一些变种,它们将“+/”改为“-”或“.”(用作编程语言中的标识符名称)或“.-”(用于XML中的Nmtoken)甚至“_:”(用于XML中的Name)。

    //Base64加密 ,abc为要加密的字符串        
    String str2= "abc"; 
    //一般加密
    byte[] b = Base64.encodeBase64(str2.getBytes(), true);
    //URL参数传递避免特殊符号
    byte[] b = Base64.encodeBase64URLSafe(str2.getBytes());   
    System.out.println(new String(b));
    
    
    //Base64解密,YWJj为要解密的字符串  
    String str3 = "YWJj"; 
    byte[] b1 = Base64.decodeBase64(str3.getBytes());   
    System.out.println(new String(b1));
    
    定位问题原因* 根据原因思考问题解决方案* 实践验证方案有效性* 提交验证结果
  • 相关阅读:
    名言
    八猫图
    springMVC 上传下载文件
    mongdb 模糊查询
    tomcat结合nginx使用小结
    orale存储过程
    java执行效率低,但效率就低吗?
    Spring aop 原始的工作原理的理解
    spring aop一些名词的理解
    Spring控制反转(IOC)和依赖注入(DI),再记不住就去出家!
  • 原文地址:https://www.cnblogs.com/jimoliunian/p/14307969.html
Copyright © 2011-2022 走看看