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);
	}
}

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM