日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

常見的哈希算法總結

作者:卡多希y 更新時間: 2022-07-22 編程語言

? ? ? ? 哈希算法又稱作消息摘要算法,它的目的就是為了驗證原始數據是否被篡改并且它只能進行加密而無法解密。我們常見的哈希算法有:MD5、SHA-1、SHA-256、SHA-512以及第三方開源庫給我們提供的一些哈希算法、以及基于哈希算法的HMac算法,例如RipeMD160,它們的輸出長度如下:

?我們以獲取圖片的MD5值為例,看看如何輸入計算哈希:

1、通過IO流拿到圖片的字節數組

2、獲取基于MD5加密算法的工具對象

3、更新原始內容

4、對數據進行加密

5、將加密后的字節數組轉換為字符串

public class Demo08 {
	public static void main(String[] args) {
		// 獲取圖片的MD5值
		try {
			byte[] imgByteArray = Files.readAllBytes(Paths.get("D:\\IOTest\\doubanPicture\\jay.jpg"));
			
			// 獲取基于MD5加密算法的工具對象
			MessageDigest digest = MessageDigest.getInstance("MD5");
			
			// 更新原始數據
			digest.update(imgByteArray);
			
			// 加密
			byte[] resByteArray = digest.digest();
			
			// 加密后的字節數組,轉換為字符串
			StringBuilder sb = new StringBuilder();
			for (byte b : resByteArray) {
				sb.append(String.format("%02x", b));
			}
			System.out.println(sb);
			System.out.println(sb.length());
		} catch (NoSuchAlgorithmException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}

結果如下:

字符串長度為32的原因是無論你要加密的內容是什么,?最后的輸出長度都會像上圖提到的輸出長度一樣,像MD5最終的輸出長度為16字節,因為我將字節數組轉換為了字符串,所以它的長度就變為了32。

其他的SHA-1、SHA-256等等,基本與MD5類似,不同的只是在獲取加密算法的工具對象時,傳進去的值不同而已。

Hmac算法就是一種基于密鑰的消息認證碼算法,它是一種更安全的消息摘要算法,在存儲用戶的口令時,通過加"鹽"的方式可以抵御彩虹表的攻擊,而這個"salt"就相當于Hmac算法里的認證碼這也是Hmac算法的一個優勢,一般情況下,Hmac算法總是和某種哈希算法配合起來使用的,而且輸出的長度也和所配合的這種哈希算法長度一致。

我們以HmacSHA1算法為例,看看如何輸入計算哈希:

1、創建密鑰生成器對象KeyGenerator

2、根據密鑰生成器生成密鑰

3、獲取算法對象Mac

4、初始化密鑰

5、更新原始內容

6、加密

7、輸出結果

public class Demo11 {
	public static void main(String[] args) {
		String psw = "Apesource";
		try {
			// 1.生成秘鑰
			// 秘鑰生成器KeyGenerator
			KeyGenerator keyGen = KeyGenerator.getInstance("HmacSHA1");
			
			// 生成秘鑰
			SecretKey key = keyGen.generateKey();
			
			// 2.使用秘鑰,進行加密
			// 獲取算法對象
			Mac mac = Mac.getInstance("HmacSHA1");
			
			// 初始化秘鑰
			mac.init(key);
			
			// 更新原始內容
			mac.update(psw.getBytes());
			
			// 加密
			byte[] resByteArray = mac.doFinal();
			
			StringBuilder res = new StringBuilder();
			for (byte b : resByteArray) {
				res.append(String.format("%02x", b));
			}
			System.out.println(res);
			System.out.println(res.length());
			
		} catch (NoSuchAlgorithmException e) {
			e.printStackTrace();
		} catch (InvalidKeyException e) {
			e.printStackTrace();
		}
	}
}

結果如下:

?最終Hmac的輸出字節數組長度為20字節,轉換為字符串為40字節。

原文鏈接:https://blog.csdn.net/qq_17845335/article/details/125919239

欄目分類
最近更新