国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Java關(guān)于MD5文件校驗(yàn)

這篇具有很好參考價(jià)值的文章主要介紹了Java關(guān)于MD5文件校驗(yàn)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

前言

JAVA中獲取文件MD5值的四種方法其實(shí)都很類似,因?yàn)楹诵亩际峭ㄟ^JAVA自帶的MessageDigest類來實(shí)現(xiàn)。獲取文件MD5值主要分為三個(gè)步驟,第一步獲取文件的byte信息,第二步通過MessageDigest類進(jìn)行MD5加密,第三步轉(zhuǎn)換成16進(jìn)制的MD5碼值。

什么是MD5算法

MD5訊息摘要演算法(英語:MD5 Message-Digest Algorithm),一種被廣泛使用的密碼雜湊函數(shù),可以產(chǎn)生出一個(gè)128位元(16位元組)的散列值(hash value),用于確保信息傳輸完整一致。

原理

MD5是一種不可逆的算法,是一種散列函數(shù),使用的是hash算法。輸入任意長度的信息,經(jīng)過處理,輸出為128位的信息(數(shù)字指紋),不同的輸入得到的不同的結(jié)果(唯一性)。
在計(jì)算過程中原文的部分信息是丟失了的。所以不能從密文(散列值)反過來得到原文,即沒有解密算法。

MD5相當(dāng)于超損壓縮。

MD5用途

1.防止被篡改:
1)比如發(fā)送一個(gè)電子文檔,發(fā)送前,我先得到MD5的輸出結(jié)果a。然后在對(duì)方收到電子文檔后,對(duì)方也得到一個(gè)MD5的輸出結(jié)果b。如果a與b一樣就代表中途未被篡改。
2)比如我提供文件下載,為了防止不法分子在安裝程序中添加木馬,我可以在網(wǎng)站上公布由安裝文件得到的MD5輸出結(jié)果。
3)SVN在檢測文件是否在CheckOut后被修改過,也是用到了MD5.

2.防止直接看到明文:
現(xiàn)在很多網(wǎng)站在數(shù)據(jù)庫存儲(chǔ)用戶的密碼的時(shí)候都是存儲(chǔ)用戶密碼的MD5值。這樣就算不法分子得到數(shù)據(jù)庫的用戶密碼的MD5值,也無法知道用戶的密碼。(比如在UNIX系統(tǒng)中用戶的密碼就是以MD5(或其它類似的算法)經(jīng)加密后存儲(chǔ)在文件系統(tǒng)中。當(dāng)用戶登錄的時(shí)候,系統(tǒng)把用戶輸入的密碼計(jì)算成MD5值,然后再去和保存在文件系統(tǒng)中的MD5值進(jìn)行比較,進(jìn)而確定輸入的密碼是否正確。通過這樣的步驟,系統(tǒng)在并不知道用戶密碼的明碼的情況下就可以確定用戶登錄系統(tǒng)的合法性。這不但可以避免用戶的密碼被具有系統(tǒng)管理員權(quán)限的用戶知道,而且還在一定程度上增加了密碼被破解的難度。)

3.防止抵賴(數(shù)字簽名):
這需要一個(gè)第三方認(rèn)證機(jī)構(gòu)。例如A寫了一個(gè)文件,認(rèn)證機(jī)構(gòu)對(duì)此文件用MD5算法產(chǎn)生摘要信息并做好記錄。若以后A說這文件不是他寫的,權(quán)威機(jī)構(gòu)只需對(duì)此文件重新產(chǎn)生摘要信息,然后跟記錄在冊(cè)的摘要信息進(jìn)行比對(duì),相同的話,就證明是A寫的了。這就是所謂的“數(shù)字簽名”。

MD5安全性

普遍認(rèn)為MD5是很安全,因?yàn)楸┝ζ平獾臅r(shí)間是一般人無法接受的。實(shí)際上如果把用戶的密碼MD5處理后再存儲(chǔ)到數(shù)據(jù)庫,其實(shí)是很不安全的。因?yàn)橛脩舻拿艽a是比較短的,而且很多用戶的密碼都使用生日,手機(jī)號(hào)碼,身份證號(hào)碼,電話號(hào)碼等等?;蛘呤褂贸S玫囊恍┘臄?shù)字,或者某個(gè)英文單詞。如果我把常用的密碼先MD5處理,把數(shù)據(jù)存儲(chǔ)起來,然后再跟你的MD5結(jié)果匹配,這時(shí)我就有可能得到明文。比如某個(gè)MD5破解網(wǎng)站http://www.cmd5.com/default.aspx,所以現(xiàn)在大多數(shù)網(wǎng)站密碼的策略是強(qiáng)制要求用戶使用數(shù)字大小寫字母的組合的方式提高用戶密碼的安全度。

方法

方法一

較為原始,將文件一次性讀入內(nèi)存,然后通過MessageDigest進(jìn)行MD5加密,最后再手動(dòng)將其轉(zhuǎn)換為16進(jìn)制的MD5值。

private final static String[] strHex = { "0", "1", "2", "3", "4", "5",
            "6", "7", "8", "9", "a", "b", "c", "d", "e", "f" };

    public static String getMD5One(String path) {
        StringBuffer sb = new StringBuffer();
        try {
            MessageDigest md = MessageDigest.getInstance("MD5");
            byte[] b = md.digest(FileUtils.readFileToByteArray(new File(path)));
            for (int i = 0; i < b.length; i++) {
                int d = b[i];
                if (d < 0) {
                    d += 256;
                }
                int d1 = d / 16;
                int d2 = d % 16;
                sb.append(strHex[d1] + strHex[d2]);
            }
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return sb.toString();
    }

方法二

借助了Integer類的方法實(shí)現(xiàn)16進(jìn)制的轉(zhuǎn)換,比方法一更簡潔一些。PS:JAVA中byte是有負(fù)數(shù)的,代碼中&0xff的操作與計(jì)算機(jī)中數(shù)據(jù)存儲(chǔ)的原理有關(guān),即負(fù)數(shù)存儲(chǔ)的是二進(jìn)制的補(bǔ)碼。

public static String getMD5Two(String path) {
        StringBuffer sb = new StringBuffer("");
        try {
            MessageDigest md = MessageDigest.getInstance("MD5");
            md.update(FileUtils.readFileToByteArray(new File(path)));
            byte b[] = md.digest();
            int d;
            for (int i = 0; i < b.length; i++) {
                d = b[i];
                if (d < 0) {
                    d = b[i] & 0xff;
                    // 與上一行效果等同
                    // i += 256;
                }
                if (d < 16)
                    sb.append("0");
                sb.append(Integer.toHexString(d));
            }
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return sb.toString();
    }

方法三

本方法在讀入文件信息上有點(diǎn)不同。這里是分多次將一個(gè)文件讀入,對(duì)于大型文件而言,比較推薦這種方式,占用內(nèi)存比較少。步驟三則是通過BigInteger類提供的方法進(jìn)行16進(jìn)制的轉(zhuǎn)換。

public static String getMD5Three(String path) {
        BigInteger bi = null;
        try {
            byte[] buffer = new byte[8192];
            int len = 0;
            MessageDigest md = MessageDigest.getInstance("MD5");
            File f = new File(path);
            FileInputStream fis = new FileInputStream(f);
            while ((len = fis.read(buffer)) != -1) {
                md.update(buffer, 0, len);
            }
            fis.close();
            byte[] b = md.digest();
            bi = new BigInteger(1, b);
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return bi.toString(16);
    }

方法四

通過調(diào)用 字節(jié)數(shù)組轉(zhuǎn)十六進(jìn)制字符串的方法 實(shí)現(xiàn)(跟方法3差不多)

public static String getMD5Four(String filePath) {

        try {
            InputStream fis = new FileInputStream(filePath); // FileNotFoundException
            MessageDigest md = MessageDigest.getInstance("MD5"); // NoSuchAlgorithmException
            byte[] buffer = new byte[1024];
            int length = -1;
            while ((length = fis.read(buffer, 0, 1024)) != -1) {  // IO exception
                md.update(buffer, 0, length);
            }
            fis.close();
            // 轉(zhuǎn)換并返回包含16個(gè)元素字節(jié)數(shù)組,返回?cái)?shù)值范圍為-128到127
            byte[] md5Bytes = md.digest();
            // 方法2 使用bigInteger
//            BigInteger bigInteger = new BigInteger(1, md5Bytes);
//            return bigInteger.toString(16);
            // 方法3  使用字節(jié)數(shù)組轉(zhuǎn)十六進(jìn)制字符串
            String strMd5 = bytesToHexStr(md5Bytes);
            return strMd5;


        } catch (FileNotFoundException e) {
            e.printStackTrace();
            return "";
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
            return "";
        } catch (IOException e) {
            e.printStackTrace();
            return "";
        }
    }

    /**
     * 字節(jié)數(shù)組轉(zhuǎn)十六進(jìn)制字符串
     * @param b 字節(jié)數(shù)組
     * @return 十六進(jìn)制字符串
     */
    public static String bytesToHexStr(byte[] b) {
        StringBuilder strBuilder = new StringBuilder();
        String strTemp = "";
        for (int n = 0; n < b.length; ++n) {
            strTemp = (Integer.toHexString(b[n] & 0XFF));
            if (strTemp.length() == 1) {
                strBuilder.append("0").append(strTemp);
            } else {
                strBuilder.append(strTemp);
            }
        }
        return strBuilder.toString();
    }

方法五

最簡單~
JAVA自帶的commons-codec包就提供了獲取16進(jìn)制MD5值的方法。其底層實(shí)現(xiàn)上,也是分多次將一個(gè)文件讀入,類似方法三、四

DigestUtils.md5Hex(new FileInputStream(path));

另外,如何知道自己生成的文件md5值是否正確?

cmd 輸入 powershell 切入到powershell面板

certutil -hashfile “./xxx.txt” MD5    # (MD5需大寫)

參考文章:

  1. JAVA中獲取文件MD5值的四種方法

  2. Java的MessageDigest類、MD5算法文章來源地址http://www.zghlxwxcb.cn/news/detail-712474.html

到了這里,關(guān)于Java關(guān)于MD5文件校驗(yàn)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • java獲取文件md5值

    給客戶交付的文件,客戶需要驗(yàn)證md5值,客戶java語言,記錄下實(shí)現(xiàn)過程,很簡單。 請(qǐng)?zhí)鎿Q path/to/your/file.txt 為你實(shí)際文件的路徑。這個(gè) Java 代碼會(huì)讀取文件內(nèi)容并生成相應(yīng)的 MD5 值。

    2024年01月17日
    瀏覽(28)
  • 文件傳輸中的MD5校驗(yàn)技術(shù)

    文件傳輸中的MD5校驗(yàn)技術(shù)

    ? 1. 文件的MD5校驗(yàn)簡介 ? 文件的MD5校驗(yàn)是一種常用的文件完整性驗(yàn)證方法。MD5(Message Digest Algorithm 5)是一種廣泛應(yīng)用的哈希算法,它能夠?qū)⑷我忾L度的數(shù)據(jù)轉(zhuǎn)換為固定長度的哈希值。在文件校驗(yàn)中,MD5算法通過計(jì)算文件的哈希值,將文件內(nèi)容轉(zhuǎn)化為唯一的128位(16字節(jié))哈

    2024年01月22日
    瀏覽(22)
  • 大文件 MD5 SHA 校驗(yàn)時(shí)間優(yōu)化之路

    大文件 MD5 SHA 校驗(yàn)時(shí)間優(yōu)化之路

    最近研發(fā)apk校驗(yàn)服務(wù),很多游戲安裝包兩三個(gè)G,如果整個(gè)拿去校驗(yàn),耗時(shí)基本二十多秒,這還僅僅是校驗(yàn)的時(shí)間,如果加上下載的時(shí)間,等待時(shí)間太長了 網(wǎng)上很多方案嘗試了一下,不太行 1、fast md5 一個(gè)第三方庫,csdn有人用過說可以提升40%的速度,然后我去試了一下,本來

    2024年02月09日
    瀏覽(26)
  • 文件MD5校驗(yàn)碼的安全性及重要性

    文件MD5校驗(yàn)碼的安全性及重要性

    文件MD5(Message Digest Algorithm 5)是一種常用的哈希算法,用于驗(yàn)證文件的完整性和安全性。本文將深入介紹文件MD5的原理、應(yīng)用場景以及如何計(jì)算和驗(yàn)證MD5值,幫助讀者更好地理解和應(yīng)用這一重要工具。 MD5算法通過對(duì)文件進(jìn)行哈希運(yùn)算,生成一個(gè)128位的唯一標(biāo)識(shí),即MD5值。這

    2024年03月09日
    瀏覽(36)
  • 獲得文件MD5——校驗(yàn)完整性 & window 和 Linux下操作

    獲得文件MD5——校驗(yàn)完整性 & window 和 Linux下操作

    1.Windows 10 自帶了一個(gè)命令行程序 certutil可以 獲取文件的 MD5 值; 2.Linux下md5sum命令獲得文件MD5值; Windows 10 自帶了一個(gè)命令行程序 certutil ,它是 Windows 10 證書服務(wù)的一部分,可以用來轉(zhuǎn)儲(chǔ)和顯示證書頒發(fā)機(jī)構(gòu)(CA)配置信息、配置證書服務(wù)、備份和還原CA組件以及驗(yàn)證證書、

    2024年02月03日
    瀏覽(31)
  • window,macOS,Linux計(jì)算文件MD5值,java實(shí)現(xiàn)例子

    打開命令行工具。在Windows系統(tǒng)中,可以使用\\\"cmd\\\"命令打開命令行窗口;在macOS或Linux系統(tǒng)中,可以使用\\\"Terminal\\\"打開終端。 進(jìn)入文件所在的目錄。使用\\\"cd\\\"命令進(jìn)入文件所在的目錄。 計(jì)算文件的MD5哈希值。在命令行中輸入\\\"certutil -hashfile 文件名 MD5\\\"命令(Windows系統(tǒng)),或者輸入

    2024年02月06日
    瀏覽(19)
  • 網(wǎng)絡(luò)文件傳輸防止篡改-校驗(yàn)工具(md5sum)的使用

    網(wǎng)絡(luò)文件傳輸防止篡改-校驗(yàn)工具(md5sum)的使用

    MD5報(bào)文摘要算法(Message-Digest Algorithm 5)常常被用來驗(yàn)證網(wǎng)絡(luò)文件傳輸?shù)耐暾?,防止文件被人篡改。此算法?duì)任意長度的信息逐位進(jìn)行計(jì)算,產(chǎn)生一個(gè)二進(jìn)制長度為128位(十六進(jìn)制長度就是32位)的“指紋”(或稱“報(bào)文摘要”),不同的文件產(chǎn)生相同的報(bào)文摘要的可能性是

    2023年04月16日
    瀏覽(23)
  • MD5生成和校驗(yàn)

    MD5生成和校驗(yàn)

    MD5 生成和校驗(yàn) 2021 年 8 月 19 日·席錦 ? 任何類型的一個(gè)文件,它都只有一個(gè)MD5值,并且如果這個(gè)文件被修改過或者篡改過,它的MD5值也將改變。因此,我們會(huì)對(duì)比文件的MD5值,來校驗(yàn)文件是否是有被惡意篡改過。 MD5的全稱是報(bào)文摘要算法(Message-Digest Algorithm 5),在90年代初

    2024年02月08日
    瀏覽(16)
  • java中MD5加密

    MD5加密是一種常見的加密方式,我們經(jīng)常用在保存用戶密碼和關(guān)鍵信息上。那么它到底有什么,又什么好處呢,會(huì)被這么廣泛的運(yùn)用在應(yīng)用開發(fā)中。 MD5加密全程是Message-Digest Algoorithm 5(信息-摘要算法),它對(duì)信息進(jìn)行摘要采集,再通過一定的位運(yùn)算,最終獲取加密后的MD5字

    2024年02月05日
    瀏覽(21)
  • Java中MD5的使用

    在Java中,可以通過正則表達(dá)式來判斷一個(gè)字符串是否是MD5字符。MD5字符通常是32位長度的十六進(jìn)制字符串,因此可以使用如下的正則表達(dá)式進(jìn)行判斷: 文章中掘金

    2024年02月12日
    瀏覽(25)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包