Android文件MD5/SHA1/SHA256校验
生活随笔
收集整理的這篇文章主要介紹了
Android文件MD5/SHA1/SHA256校验
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
????一般進行文件下載需求時,都會附帶有文件完整性和正確性校驗,避免下載的文件不完整或者被第三方劫持注入,貌似很多都是采用MD5校驗,但也有采用sha1或者sha256校驗,最近做的兩個項目中剛好先后遇到了md5和sha256校驗,跟了一下MessageDigest源碼,提取出工具類供以后使用,同時在此貢獻出來,如有不正確的地方歡迎指正。
? ? 1、采用枚舉定義需要校驗的類型,屏蔽直接傳入不支持的校驗方式,增加容錯率:
? ? 2、獲取指定文件的md5/sha1/sha256
private static String getFileSignature(File file, TypeEnum typeEnum) {MessageDigest digest;String type = "";switch (typeEnum) {case MD5:type = "MD5";break;case SHA1:type = "SHA-1";break;case SHA256:type = "SHA-256";break;}if (TextUtils.isEmpty(type)) {LogUtil.e(Constants.LOG_TAG, "type undefined");return null;}try {digest = MessageDigest.getInstance(type);} catch (NoSuchAlgorithmException e) {e.printStackTrace();return null;}InputStream is;try {is = new FileInputStream(file);} catch (FileNotFoundException e) {e.printStackTrace();LogUtil.e(TAG, "Exception while getting FileInputStream");return null;}byte[] buffer = new byte[8192];int read;try {while ((read = is.read(buffer)) > 0) {digest.update(buffer, 0, read);}byte[] md5sum = digest.digest();BigInteger bigInt = new BigInteger(1, md5sum);String output = bigInt.toString(16);output = String.format("%32s", output).replace(' ', '0');return output;} catch (IOException e) {e.printStackTrace();LogUtil.e(TAG,"Unable to process file for ");return null;} finally {try {is.close();} catch (IOException e) {e.printStackTrace();LogUtil.e(TAG, "Exception on closing inputstream:" );}}}3、與服務器給的文件md5/sha1/sha256對比
public static boolean validateFile(TypeEnum typeEnum, String standardStr, File fileToCheck) {if (TextUtils.isEmpty(standardStr) || fileToCheck == null) {LogUtil.e(TAG, "MD5 string empty or updateFile null");return false;}String calculatedDigest = getFileSignature(fileToCheck, typeEnum);if (TextUtils.isEmpty(calculatedDigest)) {LogUtil.d(TAG, "calculatedDigest null");return false;}return calculatedDigest.equalsIgnoreCase(standardStr);}全部代碼如下:
public class FileValidateUtil {private static final String TAG = Constants.LOG_TAG;public enum TypeEnum {MD5, SHA1, SHA256}/*** @param typeEnum* @param standardStr* @param fileToCheck* @return*/public static boolean validateFile(TypeEnum typeEnum, String standardStr, File fileToCheck) {if (TextUtils.isEmpty(standardStr) || fileToCheck == null) {LogUtil.e(TAG, "MD5 string empty or updateFile null");return false;}String calculatedDigest = getFileSignature(fileToCheck, typeEnum);if (TextUtils.isEmpty(calculatedDigest)) {LogUtil.d(TAG, "calculatedDigest null");return false;}return calculatedDigest.equalsIgnoreCase(standardStr);}private static String getFileSignature(File file, TypeEnum typeEnum) {MessageDigest digest;String type = "";switch (typeEnum) {case MD5:type = "MD5";break;case SHA1:type = "SHA-1";break;case SHA256:type = "SHA-256";break;}if (TextUtils.isEmpty(type)) {LogUtil.e(Constants.LOG_TAG, "type undefined");return null;}try {digest = MessageDigest.getInstance(type);} catch (NoSuchAlgorithmException e) {e.printStackTrace();return null;}InputStream is;try {is = new FileInputStream(file);} catch (FileNotFoundException e) {e.printStackTrace();LogUtil.e(TAG, "Exception while getting FileInputStream");return null;}byte[] buffer = new byte[8192];int read;try {while ((read = is.read(buffer)) > 0) {digest.update(buffer, 0, read);}byte[] md5sum = digest.digest();BigInteger bigInt = new BigInteger(1, md5sum);String output = bigInt.toString(16);output = String.format("%32s", output).replace(' ', '0');return output;} catch (IOException e) {e.printStackTrace();LogUtil.e(TAG,"Unable to process file for ");return null;} finally {try {is.close();} catch (IOException e) {e.printStackTrace();LogUtil.e(TAG, "Exception on closing inputstream:" );}}}}總結
以上是生活随笔為你收集整理的Android文件MD5/SHA1/SHA256校验的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 简约述职报告PPT模板
- 下一篇: Python将两个EXCEL去除(或保留