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));
    
    定位问题原因* 根据原因思考问题解决方案* 实践验证方案有效性* 提交验证结果
  • 相关阅读:
    容器跨主机网络通信学习笔记(以Flannel为例)
    Kubernetes控制器Job和CronJob
    记一次使用Flannel插件排错历程
    Kubernetes控制器Deployment
    Kubernetes如何通过StatefulSet支持有状态应用?
    react18 来了,我 get 到...
    gojs 实用高级用法
    vuecli3 vue2 保留 webpack 支持 vite 成功实践
    calibre 报错 This application failed to start because no Qt platform plugin could be initialized. Reinstalling the application may fix this problem. 解决
    unable to recognize "*.yaml": no matches for kind "RoleBinding" in version "rbac.authorization.k8s.io/v1beta1"
  • 原文地址:https://www.cnblogs.com/jimoliunian/p/14307969.html
Copyright © 2011-2022 走看看