編碼、摘要和加密(二)——信息摘要

0. 前言

信息摘要,英譯 Message Digest 。看見首字母這麼大的 MD有沒有當即聯想到 MD5 算法。其實 MD5算法只是目前比較流行的信息摘要算法,在它以前,還出現過 MD2 MD4,以及目前仍然在用的安全散列算法(Secure Hash AlgorithmSHA1SHA256都屬於信息摘要算法的一種。國家密碼管理局於2010年12月也發佈了一種信息摘要算法 SM3git

因爲對信息摘要算法研究並不透徹,所以這篇文章將重點講 jdk 支持的三個常見摘要算法的使用:MD5SHA1SHA256github

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 算法爲例:spa

/** * 計算文件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-1SHA-256代理

3. 總結

千萬不要認爲 MD5 是加密算法。信息摘要算法,是一種單向散列算法,是一種不可逆的算法,即,能夠根據一個字符串計算出 MD5,卻不能根據 MD5 還原出生成它的字符串。code

以爲有用?那打賞一個唄。我要打賞對象

此處是廣告Flueky的技術小站

相關文章
相關標籤/搜索