• 加密算法 MD5 和 SHA 的 JAVA 实现


    首先先简单的介绍一下MD5 和 SHA 算法      

    然后看一下在  java.security.MessageDigest   (信息摘要包下) 如何分别实现  md5 加密 和 sha 加密

    最后在看一下  使用httpclient包  依赖下的 commons-codec-org.  包 下的apache.commons.codec.digest.DigestUtils 这个工具类 是如何快速实现md5 和 SHA 加密的

     还有spring包下的

    org.springframework.util.DigestUtils;    DigestUtils工具 

     MD5 算法  

    MD5的全称是Message-Digest Algorithm 5(信息-摘要算法),在90年代初由MIT Laboratory for Computer Science和RSA Data Security Inc的Ronald L. Rivest开发出来,经MD2、MD3和MD4发展而来。

    MD5,用于确保信息传输完整一致。是计算机广泛使用的杂凑算法之一(又译摘要算法、哈希算法),主流编程语言普遍已有MD5实现。

    将数据(如汉字)运算为另一固定长度值,是杂凑算法的基础原理,常用于文件校验。校验?不管文件多大,经过MD5后都能生成唯一的MD5值。

    MD5算法具有以下特点:

    1、压缩性:任意长度的数据,算出的MD5值长度都是固定的。
    2、容易计算:从原数据计算出MD5值很容易。
    3、抗修改性:对原数据进行任何改动,哪怕只修改1个字节,所得到的MD5值都有很大区别。
    4、弱抗碰撞:已知原数据和其MD5值,想找到一个具有相同MD5值的数据(即伪造数据)是非常困难的。
    5、强抗碰撞:想找到两个不同的数据,使它们具有相同的MD5值,是非常困难的。
    MD5的作用是让大容量信息在用数字签名软件签署私人密钥前被”压缩”成一种保密的格式(就是把一个任意长度的字节串变换成一定长的十六进制数字串)。除了MD5以外,其中比较有名的还有sha-1、RIPEMD以及Haval等。
    MD5 是单向的  不可逆 

    SHA算法  
    安全哈希算法(Secure HashAlgorithm)主要适用于数字签名标准(DigitalSignature Standard DSS)里面定义的数字签名算法(DigitalSignature Algorithm DSA)。对于长度小于2^64位的消息,SHA1会产生一个160位的消息摘要。该算法经过加密专家多年来的发展和改进已日益完善,并被广泛使用。该算法的思想是接收一段明文,然后以一种不可逆的方式将它转换成一段(通常更小)密文,也可以简单的理解为取一串输入码(称为预映射或信息),并把它们转化为长度较短、位数固定的输出序列即散列值(也称为信息摘要或信息认证代码)的过程。散列函数值可以说是对明文的一种"指纹"或是"摘要"所以对散列值的数字签名就可以视为对此明文的数字签名。

         就安全性而言  sha要比md5 安全      

       md5 是     一个128位(16字节)的散列值(hash value)

       sha-1   是 160位     其余还有 sha2.....

     请参考  

    https://www.jianshu.com/p/d6b491b235fe

    https://blog.csdn.net/miaomiaowyj/article/details/79976653

     https://blog.csdn.net/jiangyu1013/article/details/73290371

    java.security.MessageDigest   (信息摘要包下) 如何分别实现  md5 加密 和 sha 加密

    package com.io.digest;
    
    import java.math.BigInteger;
    import java.security.MessageDigest;
    import java.security.NoSuchAlgorithmException;
    
    /**
     * SHA md5 的 实现     
     * 使用  java.security.MessageDiges  
     * @author lqf
     *
     */
    public class Test01 {
        public static final String KEY_MD5 = "MD5";   
        public static final String KEY_SHA = "SHA";
    
        
        public static void main(String[] args) {
            System.out.println("md5加密后的数据"+md5("123"));
            System.out.println("sha加密后的数据"+SHA("123"));
               
        }
        
        /**
         * 使用md5的算法进行加密
         */
        public static String md5(String data) {
            byte[] bytes01 = null ;
            byte[] bytes02 = null ;
            try {
                //返回实现指定摘要算法的MessageDigest对象。 
                MessageDigest digest = MessageDigest.getInstance(KEY_MD5);
                bytes01= data.getBytes(); //将字符串转为 字节数组 
                digest.update(bytes01); //使用指定的字节数组更新摘要。    可以对这个字节数组设置偏移量  可以不写这个操作
                bytes02= digest.digest();//通过执行最后的操作(如填充 )来完成哈希计算。 
                 //上面的三步 可以用一步代替          
                //bytes02=digest.digest(data.getBytes());   //可不不要 update  直接使用 digest(byte[] byte)的方法
                
            } catch (NoSuchAlgorithmException e1) {
                // TODO Auto-generated catch block
                e1.printStackTrace();
            }
            
            String md5code = new BigInteger(bytes02).toString(16);  // 转为  16进制数
            // 如果生成数字未满32位,需要前面补0
            for (int i = 0; i < 32 - md5code.length(); i++) {
                md5code = "0" + md5code;
            }
            return md5code;
            
        }
        /**
         * SHA 加密
         * @param data
         * @return
         */
        public static String SHA(String data) {
            byte[] digest= null ;
            try {
                //和上面的步骤一模一样就是改一下  指定的算法 这里把几个步骤和一起了 
                digest = MessageDigest.getInstance(KEY_SHA).digest(data.getBytes());
            } catch (NoSuchAlgorithmException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            String shacode=new BigInteger(1, digest).toString(32); //32 进制数字 
            
            
            return shacode;
            
        }
    
    
    }

      使用httpclient包  依赖下的 commons-codec-org.  包 下的apache.commons.codec.digest.DigestUtils 这个工具类 快速实现md5 和 SHA 加密的

      DigestUtils这个工具包 对 java包下的messageDigest 进行了 扩展和封装  使得加密算法 实现起来变得异常简单   

    包的依赖结构

       

      

    通过这些方法 可以拿来即用   

     这个是 Spring - core 下的 utils工具类 扩展的DigestUtils 工具    可以看出来 没有上面的哪一个强大  没有 sha  

     不过值得注意的是 如果你要想用spring包下的 digestUtils工具的话   导包的时候一定要看清楚啊   不要和上面的路径弄混了  切记切记 !!!!

    最后 看一下 这俩个包的混合使用    

     第一个是 spring的  第二个 是 commons的     你得出什么结论了吗?  (#^.^#)

  • 相关阅读:
    MyEclipse错误积累--持续更新
    Git错误积累-持续更新
    MySQL错误积累-持续更新
    评价一个人,就是要看他把时间都花在哪了
    收集的yum命令博文
    Github 常用命令
    python库收藏
    [转载]Scikit Learn: 在python中机器学习
    Windows下python安装Matplotlib、Numpy和Scipy模块
    [LeetCode] #45 Jump Game II
  • 原文地址:https://www.cnblogs.com/qinning/p/11066703.html
Copyright © 2020-2023  润新知