zoukankan      html  css  js  c++  java
  • Java 常见摘要算法——md5、sha1、sha256

    目录


    摘要算法简介

    md5

    使用jdk内置方法实现md5加密

    使用bc方式实现md5加密

    使用cc方式实现md5加密

    sha1

    使用jdk内置方法实现sha1加密

    使用bc方式实现sha1加密

    使用cc方式实现sha1加密

    实现sha256的代码和sha1的代码相似


     

    摘要算法简介

      摘要算法,也是加密算法的一种,还有另外一种叫法:指纹。摘要算法就是对指定的数据进行一系列的计算,然后得出一个串内容,该内容就是该数据的摘要。不同的数据产生的摘要是不同的,所以,可以用它来进行一些数据加密的工作:通过对比两个数据加密后的摘要是否相同,来判断这两个数据是否相同。

      还可以用来保证数据的完整性,常见的软件在发布之后,会同时发布软件的md5和sha值,这个md5和sha值就是软件的摘要。当用户将软件下载之后,然后去计算软件的摘要,如果计算所得的摘要和软件发布方提供的摘要相同,则证明下载的软件和发布的软件一模一样,否则,就是下载过程中数据(软件)被篡改了。

      常见的摘要算法包括:md、sha这两类。md包括md2、md4、md5;sha包括sha1、sha224、sha256、sha384、sha512。

    md5

      md摘要算法包括多种算法:分别是md2、md4、md5。现在一般都是使用md5进行加密。

      Java中实现md5加密,有三种方式:

      使用jdk内置的方法实现实现md5加密

    package cn.ganlixin.security;
    
    import java.security.MessageDigest;
    import java.security.NoSuchAlgorithmException;
    
    import org.apache.commons.codec.binary.Hex;
    
    public class JdkMD5 {
    	public static void main(String[] args) throws NoSuchAlgorithmException {
    		String plainText = "this is plain text";
    		
    		// 通过调用MessageDigest(数据摘要类)的getInstance()静态方法,传入加密算法的名称,获取数据摘要对象。
    		//MessageDigest MessageDigest.getInstance(algorithm);
    		MessageDigest messageDigest = MessageDigest.getInstance("MD5");
    		
    		// 获取摘要(加密),结果是字节数组
    		// byte[] java.security.MessageDigest.digest(byte[] input)
    		byte[] ciphertext = messageDigest.digest(plainText.getBytes());
    		
    		// 利用apache的commons-codec,将字节数组转换为十六进制。
    		System.out.println(Hex.encodeHexString(ciphertext));
    	}
    }
    

        

      使用bc方式实现md5加密

      这种方式需要下载bc的jar包,bc是bouncycastle的缩写。

      jar包的下载地址:http://bouncycastle.org/latest_releases.html

    package cn.ganlixin.security;
    
    import java.security.NoSuchAlgorithmException;
    
    import org.bouncycastle.crypto.digests.MD5Digest;
    import org.bouncycastle.util.encoders.Hex;
    
    public class BcMD5 {
    	public static void main(String[] args) throws NoSuchAlgorithmException {
    		
    		String plainText = "this is plain text";
    		
    		// 直接创建一个MD5Digest对象(bouncycastle的)
    		MD5Digest md5Digest = new MD5Digest();
    		
    		md5Digest.update(plainText.getBytes(), 0, plainText.getBytes().length);
    		
    		// 获取这种加密方式在加密之后,字节数组的长度
    		byte[] cipherBytes = new byte[md5Digest.getDigestSize()];
    		md5Digest.doFinal(cipherBytes, 0);
    		
    		// 使用bc自己的hex类将字节数组转换为十六进制
    		String cipherStr = Hex.toHexString(cipherBytes);
    		System.out.println(cipherStr);
    	}
    }
    

      

      使用Cc方式实现md5加密

      Cc,是commons.codec的简写,需要下载apache-commons-codec的jar包。

      cc方式实现md5加密,其实是对jdk实现md5加密进行了封装和简化操作,从下面的代码量和可读性就可以看出来,cc方式实现md5加密很方便。

    package cn.ganlixin.security;
    
    import org.apache.commons.codec.digest.DigestUtils;
    
    public class CcMD5 {
    	public static void main(String[] args) {
    		
    		String plainText = "this is plain text";
    		
    		// cc方式是使用codec中的DigestUtils工具类
    		/*
    		对于md5加密来说,DigestUtils提供了6个静态方法
    		byte[] DigestUtils.md5(byte[] data)
    		byte[] DigestUtils.md5(InputStream is)
    		byte[] DigestUtils.md5(String data)
    	
    		String DigestUtils.md5Hex(byte[] data)
    		String DigestUtils.md5Hex(InputStream is)
    		String DigestUtils.md5Hex(String data)
    		 */
    		
    		// 实现md5加密只需要一行代码
    		String cipherText = DigestUtils.md5Hex(plainText);
    		System.out.println(cipherText);
    	}
    }
    

      

    sha1

      sha类加密算法有多种,共两大类,一类是sha1,另一类包含多种加密算法:sha224、sha256、sha384、sha512,这些统称为sha2。

      其中sha1加密后的长度是160byte,sha2加密之后的密文长度和shaXxx的数字相同,比如sha256加密之后,密文长度为256byte。

    使用jdk内置方法实现sha1加密

    package cn.ganlixin.security;
    
    import java.security.MessageDigest;
    import java.security.NoSuchAlgorithmException;
    
    import org.apache.commons.codec.binary.Hex;
    
    public class JDKSHA1 {
    	
    	public static void main(String[] args) throws NoSuchAlgorithmException {
    		
    		String plainText = "this is plain Text";
    		
    		// 获取指定摘要算法的messageDigest对象
    		MessageDigest messageDigest = MessageDigest.getInstance("SHA"); // 此处的sha代表sha1
    		
    		// 调用digest方法,进行加密操作
    		byte[] cipherBytes = messageDigest.digest(plainText.getBytes());
    		
    		String cipherStr = Hex.encodeHexString(cipherBytes);
    		
    		System.out.println(cipherStr);
    		
    	}
    }
    

      

    使用bc方式实现sha1加密

    package cn.ganlixin.security;
    
    import org.bouncycastle.crypto.Digest;
    import org.bouncycastle.crypto.digests.SHA1Digest;
    import org.bouncycastle.util.encoders.Hex;
    
    public class BcSHA1 {
    	public static void main(String[] args) {
    		
    		String plainText = "this is plain Text";
    		
    		Digest digest = new SHA1Digest();
    		
    		digest.update(plainText.getBytes(), 0, plainText.getBytes().length);
    		
    		// 创建保存摘要的字节数组
    		byte[] cipherBytes = new byte[digest.getDigestSize()];
    		
    		digest.doFinal(cipherBytes, 0);
    		
    		String cipherText = Hex.toHexString(cipherBytes);
    		System.out.println(cipherText);
    		
    	}
    }
    

      

    使用cc方式实现sha1加密

       cc方式实现sha1加密,超级简单,和实现md5加密一样,一行代码即可。

    package cn.ganlixin.security;
    
    import org.apache.commons.codec.digest.DigestUtils;
    
    public class CcSHA1 {
    	public static void main(String[] args) {
    		String cipherText = DigestUtils.sha1Hex("this is plain Text");
    		System.out.println(cipherText);
    	}
    }
    

      

  • 相关阅读:
    渗透测试-内网渗透笔记
    渗透测试-信息搜集笔记
    Mysql注入笔记
    XSS漏洞理解
    tomcat服务器配置及加固
    python3基础学习笔记
    http.sys远程代码执行漏洞(MS15-034)
    Map and Set(映射和集合)
    防抖 | 节流
    for循环中的闭包
  • 原文地址:https://www.cnblogs.com/-beyond/p/10575078.html
Copyright © 2011-2022 走看看