1. 程式人生 > >Java實現訊息摘要演算法加密

Java實現訊息摘要演算法加密

訊息摘要演算法:

MD(Message Digest) 訊息摘要

SHA(Secure Hash Algorithm) 安全雜湊

MAC(Message Authentication Code) 訊息認證碼

作用:(驗證資料完整性、數字簽名核心演算法)

將輸入的任意長度序列資料對映為128bit的輸出序列,一般來說只要輸入的內容不同,映射出來的序列就不相同,就可以用來驗證資料的完整性。(比如從一個網站下載了一個檔案,而這個網站又留下了該檔案的訊息摘要,我們只要計算下這個檔案的訊息摘要再和網站上的比對下,就可以知道這個檔案是否下載完整。)還有一個功能就是資料的機密性,儲存密碼到資料庫時,不直接儲存密碼的明文,而是儲存密碼的訊息摘要,在驗證密碼的時候,將密碼的訊息摘要和儲存在資料庫內容進行比較,就可以檢測密碼的正確性,同時保證了機密性。

資料庫明文儲存密碼的後果:CSDN網站六百萬使用者資訊外洩、推特使用者密碼被明文洩漏

結合訊息摘要演算法的一種安全的登入驗證方式:

訊息摘要演算法——MD

MD家族(128位摘要資訊)(MD2、MD4、MD5)

Commons Codec & Bouncy Castle 下載

JDK實現:

package practice;

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

import org.apache.commons.codec.binary.Hex;

public class MD5Test {

	private static String str = "test text";

	public static void main(String[] args) {
		MessageDigest md;
		try {
			md = MessageDigest.getInstance("MD5"); // 得到MD5的加密物件
			byte[] strOut = md.digest(str.getBytes());
			System.out.println(Hex.encodeHex(strOut)); // Hex由Commons Codec提供,將byte陣列轉為16進位制
		} catch (NoSuchAlgorithmException e) {
			e.printStackTrace();
		}
	}
}

Bouncy Castle實現:

package practice;

import org.bouncycastle.crypto.Digest;
import org.bouncycastle.crypto.digests.MD5Digest;
import org.bouncycastle.util.encoders.Hex;

public class MD5Test {

	private static String str = "test text";

	public static void main(String[] args) {
		Digest digest = new MD5Digest();
		digest.update(str.getBytes(), 0, str.getBytes().length); // 處理的資料、開始的位置、處理的長度
		byte[] md5Bytes = new byte[digest.getDigestSize()];
		digest.doFinal(md5Bytes, 0); // 輸出內容和偏移量
		System.out.println(Hex.toHexString(md5Bytes)); // Hex由BouncyCastle提供
	}
}

Commons Codec實現:

package practice;

import org.apache.commons.codec.digest.DigestUtils;

public class MD5Test {

	private static String str = "test text";

	public static void main(String[] args) {
		System.out.println(DigestUtils.md5Hex(str.getBytes()));
	}
}

有沒有通過上述程式發現MD5 加密之後的長度是一樣的,不管原本的資訊有多長?這是因為 MD5 是摘要演算法,有點類似於從你要加密的資訊中選取一部分資訊出來加密,所以即使你得到了 MD5 加密之後的結果,也很難從一部分資訊中反推出原本的完整資訊。另外,MD5 也是存在被破解的情況,那就是最傳統的破解方法,從一堆資料中一個個去試。所以, MD5 可以設定一個鹽值,類似於干擾資訊,可以降低被破解的概率。

訊息摘要演算法——SHA

留坑待填

訊息摘要演算法——MAC

留坑待填