日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

用MD5验证上传文件的完整性

發布時間:2023/12/20 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 用MD5验证上传文件的完整性 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

在項目的開發資源開發中,測試發現一個問題:將資源上傳到服務器上,提示已經上傳成功,但是當打開這個文件時發現失敗,由于各種原因資源已經毀壞。怎么樣能保證資源的完整性,處理辦法就是用MD5驗證文件的完整性。
任何一個字符串或文件,無論是可執行程序、圖像文件、臨時文件或者其他任何類型的文件,也不管它體積多大,都有且只有一個獨一無二的MD5信息碼,并且如果這個文件被修改過,它的MD5碼也將隨之改變。
Message-Digest泛指字節串(Message)的Hash變換,就是把一個任意長度的字節串變換成一定長的大整數。注意這里說的是“字節串”而不是“字符串”,因為這種變換只與字節的值有關,與字符集或編碼方式無關。
在Java中,java.security.MessageDigest (rt.jar中)已經定義了 MD5 的計算,所以我們只需要簡單地調用即可得到 MD5 的128 位整數。然后將此 128 位計 16 個字節轉換成 16 進制表示即可。

import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException;public class TestMD5Two {/*** 默認的密碼字符串組合,用來將字節轉換成 16 進制表示的字符,apache校驗下載的文件的正確性用的就是默認的這個組合*/protected static char hexDigits[] = { '0', '1', '2', '3', '4', '5', '6','7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' };protected static MessageDigest messagedigest = null;static {try {messagedigest = MessageDigest.getInstance("MD5");} catch (NoSuchAlgorithmException nsaex) {System.err.println(TestMD5Two.class.getName()+ "初始化失敗,MessageDigest不支持MD5Util。");nsaex.printStackTrace();}}/*** 生成字符串的md5校驗值* * @param s* @return*/public static String getMD5String(String s) {return getMD5String(s.getBytes());}/*** 判斷字符串的md5校驗碼是否與一個已知的md5碼相匹配* * @param password 要校驗的字符串* @param md5PwdStr 已知的md5校驗碼* @return*/public static boolean checkPassword(String md5, String md5PwdStr) {return md5.equals(md5PwdStr);}/*** 生成文件的md5校驗值* * @param file* @return* @throws IOException*/public static String getFileMD5String(File file) throws IOException { InputStream fis;fis = new FileInputStream(file);byte[] buffer = new byte[1024];int numRead = 0;while ((numRead = fis.read(buffer)) > 0) {messagedigest.update(buffer, 0, numRead);}fis.close();return bufferToHex(messagedigest.digest());}public static String getMD5String(byte[] bytes) {messagedigest.update(bytes);return bufferToHex(messagedigest.digest());}private static String bufferToHex(byte bytes[]) {return bufferToHex(bytes, 0, bytes.length);}private static String bufferToHex(byte bytes[], int m, int n) {StringBuffer stringbuffer = new StringBuffer(2 * n);int k = m + n;for (int l = m; l < k; l++) {appendHexPair(bytes[l], stringbuffer);}return stringbuffer.toString();}private static void appendHexPair(byte bt, StringBuffer stringbuffer) {char c0 = hexDigits[(bt & 0xf0) >> 4];// 取字節中高 4 位的數字轉換, >>> 為邏輯右移,將符號位一起右移,此處未發現兩種符號有何不同 char c1 = hexDigits[bt & 0xf];// 取字節中低 4 位的數字轉換 stringbuffer.append(c0);stringbuffer.append(c1);}public static void main(String[] args) throws IOException {long begin = System.currentTimeMillis();File file = new File("H:/12345.txt");String md5 = getFileMD5String(file);//文件名不同,內容相同;File file2 = new File("H:/12345(2).txt");String md52= getFileMD5String(file2);//文件名不同,內容不同;File file3 = new File("H:/12345(3).txt");String md53= getFileMD5String(file3);//測試壓縮包File fileZip = new File("H:/1.zip");String md5Zip= getFileMD5String(fileZip);//測試壓縮包File fileZip2 = new File("H:/2.zip");String md5Zip2= getFileMD5String(fileZip2);System.out.println("MD5:"+md5);System.out.println("MD5:"+md52);System.out.println("MD5:"+md53);System.out.println("MD5:"+md5Zip);System.out.println("MD5:"+md5Zip2);System.out.println("兩個文件名不同,內同相同"+ checkPassword(md5, md52));System.out.println("文件名不同,內容不同"+ checkPassword(md5, md53));System.out.println("測試壓縮包,內容不同"+ checkPassword(md5Zip, md5Zip2));long end = System.currentTimeMillis();System.out.println("md5:" + md5 + " time:" + ((end - begin) / 1000) + "s");} }

總結

以上是生活随笔為你收集整理的用MD5验证上传文件的完整性的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。