一般进行文件下载需求时,都会附带有文件完整性和正确性校验,避免下载的文件不完整或者被第三方劫持注入,貌似很多都是采用MD5校验,但也有采用sha1或者sha256校验,最近做的两个项目中刚好先后遇到了md5和sha256校验,跟了一下MessageDigest源码,提取出工具类供以后使用,同时在此贡献出来,如有不正确的地方欢迎指正。

1、采用枚举定义需要校验的类型,屏蔽直接传入不支持的校验方式,增加容错率:

public enum TypeEnum {MD5, SHA1, SHA256}

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校验相关推荐

  1. Windows系统中通过命令查看文件的MD5,SHA1,SHA256校验值

    Windows系统中通过命令查看文件的MD5,SHA1,SHA256校验值 命令格式如下: certutil -hashfile yourfilename MD5 certutil -hashfile ...

  2. Windows cmd 查看文件MD5 SHA1 SHA256

    Windows cmd 查看文件MD5 SHA1 SHA256 certutil -hashfile yourfilename.ext MD5certutil -hashfile yourfilena ...

  3. 在Windows系统中查看下载文件的MD5,SHA1,SHA256校验码

    步骤一: 打开Windows终端 1. Windows按键+R 2. 输入CMD 3. 点击确定,打开终端 步骤二: 在Windows终端中输入校验命令 1. Windows终端命令结构 certut ...

  4. certutil 校验文件md5,sha1,sha256

    certutil -hashfile yourfilename MD5 certutil -hashfile yourfilename SHA1 certutil -hashfile yourfile ...

  5. Java 读取文件 MD5 sha1 sha256 sha224 sha384 sha512

    在Java中读取文件的MD5或SHA码,用于对文件完整性进行校验,示例代码较为简单,如下: 一.使用到的 jar (pom.xml) <dependency><groupId> ...

  6. 【windows 自带的certutil 完成 md5, sha1 sha256校验】

    命令格式 certutil -hashfile xxx.zip md5 certutil -hashfile xxx.zip sha1 certutil -hashfile xxx.zip sha25 ...

  7. android sha1校验工具,【原创实用】文件校验工具V1.2.1:支持MD5 SHA1 SHA256

    前言:这个程序其实我很早以前(大概上上周?)就已经完成了 但是没有发布,因为我还想不断打磨打磨. 先别走,结尾还有彩蛋 现如今相较第一个版本,已经进行如下改动: 解决clear之后后台线程依然未停止的 ...

  8. 快速计算文件的MD5/SHA1/SHA256等校验值(Windows/Linux)

    从网络上下载文件,尤其是非常大的文件怎么确保文件准确无误呢? 通常网站提供文件时会同时提供该文件的校验值,如MD5,SHA1,SHA256等, 当文件下载完成后,计算它的校验值,如果和网站提供的一致, ...

  9. 使用Windows 10自带工具 校验MD5 SHA1 SHA256类型文件

    使用Windows 10自带工具 校验MD5 SHA1 SHA256类型文件 适用场景:下载文件的完整性校验等. cmd调出命令行,输入如下命令 certutil -hashfile <文件名& ...

  10. windows10下使用certutil工具对下载文件进行SHA1、MD5、SHA256校验

    windows10下使用certutil工具对下载文件进行SHA1.MD5.SHA256校验 校验的命令格式如下: 下面以SHA1哈希校验举例 要先通过cmd进入目标文件的目录下,再进行哈希校验,否则 ...

最新文章

  1. 如何建立和维护自己的“人脉”
  2. 柴油发电机并机母线之间母联的设置分析
  3. PMCAFF | 团队有20名产品经理,如何争取更多开发资源?
  4. js ajax 浏览器兼容,JS跨浏览器兼容,一点点总结
  5. 大数据平台蓝图_数据科学面试蓝图
  6. 根据年月日计算是星期几的函数,基姆拉尔森计算公式
  7. vba 循环读取单元格_利用VBA打开顺序文件,并读取
  8. SQLServer基础之数据页类型:GAM,SGAM,PFS
  9. 【实践】一站式数据开发平台在有赞的最佳实践.pdf(附下载链接)
  10. 使用Eclipse编写Processing小程序
  11. python数值类型和序列类型_Python基础 1数值类型 序列类型
  12. android viewpager 底部tabhost,TabHost+ViewPager实现底部导航效果
  13. Django中文文档
  14. 大话设计模式之爱你一万年:第一章 设计模式基本概念:1.软件设计模式概述
  15. 周鸿伟揭秘华为事件,美国针对华为另有打算
  16. 实验吧-杯酒人生(凯撒解密,维基利亚密码)
  17. Redis应用项目---抢红包功能(二)
  18. 统计学上数据的处理和图标的展示原则
  19. 网络安全学习笔记——蓝队实战攻防
  20. excel毫秒、微妙运算

热门文章

  1. Linux debian利用ifconfig查看IP地址
  2. emulator-5554 offline问题
  3. parallel循环java_使用Java8新特性parallelStream遇到的坑
  4. 有些路,只能一个人走。
  5. 秦纪二 秦始皇帝二十年(甲戌,公元前227年)——摘要
  6. 一种巧妙的解决方案,一键恢复Win11中消失不见的“Microsoft Store”微软应用商店
  7. 台式机U盘安装Centos 安装界面黑屏并且没有网卡驱动
  8. 2022 下半年一定不要裸辞!
  9. 项目经理的“势能”培养 (转)
  10. Verilog中$finish和$stop的区别