1. 程式人生 > >Java基礎之加解密(三) SHA安全雜湊演算法

Java基礎之加解密(三) SHA安全雜湊演算法

介紹:安全雜湊演算法(Secure Hash Algorithm)主要適用於數字簽名標準(Digital Signature Standard DSS)裡面定義的數字簽名演算法(Digital Signature Algorithm DSA)。該演算法的思想是接收一段明文,然後以一種不可逆的方式將它轉換成一段(通常更小)密文,也可以簡單的理解為取一串輸入碼(稱為預對映或資訊),並把它們轉化為長度較短、位數固定的輸出序列即雜湊值(也稱為資訊摘要或資訊認證程式碼)的過程

各個實現廠家:


Bouncy Castle也是對jdk的補充,commons codec同樣是對jdk的簡化。

實現程式碼:

package dms.java.base.security;

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.security.Security;

import org.apache.commons.codec.binary.Hex;
import org.apache.commons.codec.digest.DigestUtils;
import org.bouncycastle.crypto.digests.SHA1Digest;
import org.bouncycastle.jce.provider.BouncyCastleProvider;

/**
 * 使用1.jdk 2.bouncy castle 3.commons codec 實現sha加密演算法
 * 下面以sha1為例,其他版本類似
 * @Title: SHATest.java  
 * @Package dms.java.base.security  
 * @Description:   
 * @author BrightSt    
 * @date 2017年3月26日 下午3:06:01  
 * @version V1.0
 */
public class SHATest {

	private static String src = "這是我的內容";
	public static void main(String[] args) {
		jdkSha();
		bouncyCastleSha();
		commonsCodecSha();
		addProvider();
	}
	
	/**
	 * jdk 實現方式
	 */
	public static void jdkSha(){
		try {
			MessageDigest me = MessageDigest.getInstance("SHA");
			me.update(src.getBytes());
			System.out.println("jdk sha1:"+Hex.encodeHexString(me.digest()));
		} catch (NoSuchAlgorithmException e) {
			e.printStackTrace();
		}
		
	}
	
	/**
	 * bouncy castle 實現方式
	 */
	public static void bouncyCastleSha(){
		SHA1Digest d = new SHA1Digest();
		d.update(src.getBytes(),0,src.getBytes().length);
		byte[] shaDecode = new byte[d.getDigestSize()];
		d.doFinal(shaDecode, 0);
		System.out.println("bouncyCastle sha1 : "+org.bouncycastle.util.encoders.Hex.toHexString(shaDecode));
	}
	
	/**
	 * commons codec 實現方式
	 */
	public static void commonsCodecSha(){
		try {
//			MessageDigest md = DigestUtils.getSha1Digest();
//			md.update(src.getBytes());
//			System.out.println("commons codec sha :" + Hex.encodeHexString(md.digest()));
			// 上面簡化後
			System.out.println("commons codec sha :" +DigestUtils.sha1Hex(src.getBytes()));
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	/**
	 * 給jdk增加實現廠商的方式
	 */
	public static void addProvider(){
		try {
			Security.addProvider(new BouncyCastleProvider());
			MessageDigest md = MessageDigest.getInstance("SHA");
			md.update(src.getBytes());
			System.out.println("add provider sha : "+ Hex.encodeHexString(md.digest()));
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

}
HSA與MD同樣的是單向的,只能進行加密,不能進行解密。
SHA雜湊演算法的應用:1.網站的安全證書:


2.訊息的傳送,先發送摘要資訊,在傳送原始資訊,進行比對。

3.聯合登入場景,可以在訊息內容里加入雙方約定的key和時間戳。