編碼、摘要和加密(二)——資訊摘要
資訊摘要,英譯Message Digest
。看見首字母這麼大的M
、D
有沒有立即聯想到MD5
演算法。其實MD5
演算法只是目前比較流行的資訊摘要演算法,在它之前,還出現過MD2
MD4
,以及目前仍然在用的安全雜湊演算法(Secure Hash Algorithm
)SHA1
和SHA256
都屬於資訊摘要演算法的一種。國家密碼管理局於2010年12月也釋出了一種資訊摘要演算法SM3
。
由於對資訊摘要演算法研究並不透徹,因此這邊公章將重點講 jdk 支援的三個常見摘要演算法的使用:MD5
、SHA1
、SHA256
。
1. 相關程式碼
Java 對資訊摘要演算法做了比較完整的封裝——MessageDigest
。該類是抽象類,針對具體資訊摘要演算法的實現使用了代理模式。主要提供了三個方法及其過載方法。
/** * 獲取摘要演算法物件。 * 通過指定引數 algorithm 是 MD5 SHA1 SHA256 ,獲取具體的例項。 */ static MessageDigest getInstance /** * 接收參與摘要計算的位元組資料,可多次執行。一般用於檔案的的摘要計算。 * 也可以一次將檔案的全部位元組讀取至記憶體,使用 digest 方法一次計算。 */ void update /** * 具有兩種使用場景。 * 1. 在 update 方法接收全部的位元組資料之後,使用此方法生成摘要資料。 * 2. 直接使用此方法接收較短的位元組資料,生成摘要資料。 */ byte[] digest 複製程式碼
2. 用途
2.1 計算字串
用於校驗報文資料在網路傳輸的過程中是否被篡改過。
以 MD5 演算法為例:
/** * 計算字串md5 * * @param data * @return */ public static final String md5(String data) { try { MessageDigest messageDigest = MessageDigest.getInstance("MD5"); byte[] digest = messageDigest.digest(data.getBytes()); return HexUtil.encode(digest); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } return null; } 複製程式碼
2.2 計算檔案
通過網路下載一些檔案的時候,通常通過計算下載下來檔案的 MD5 和 SHA1 判斷下載下來的檔案是否在傳輸過程中被篡改過。
以 MD5 演算法為例:
/** * 計算檔案md5 * * @param data * @return */ public static final String fileMd5(String path) { try { MessageDigest messageDigest = MessageDigest.getInstance("MD5"); File file = new File(path); if (!file.exists()) throw new IllegalArgumentException("The file path is illegal"); InputStream inputStream = new FileInputStream(file); byte[] buff = new byte[1024]; int len; while ((len = inputStream.read(buff)) > 0) { messageDigest.update(buff, 0, len); } byte[] digest = messageDigest.digest(); return HexUtil.encode(digest); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return null; } 複製程式碼
如需計算 SHA1 和 SHA256 ,只需將getInstance
的引數值改成SHA-1
和SHA-256
。
3. 總結
千萬不要認為MD5
是加密演算法。資訊摘要演算法,是一種單向雜湊演算法,是一種不可逆的演算法,即,可以根據一個字串計算出MD5
,卻不能根據MD5
還原出生成它的字串。
覺得有用?那打賞一個唄。我要打賞
此處是廣告:Flueky的技術小站