生活随笔
收集整理的這篇文章主要介紹了
用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 {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();}}public static String
getMD5String(String s
) {return getMD5String(s
.getBytes());}public static boolean checkPassword(String md5
, String md5PwdStr
) {return md5
.equals(md5PwdStr
);}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];char c1
= hexDigits
[bt
& 0xf];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验证上传文件的完整性的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。