文章目录

  • 一、使用场景
  • 二、加密算法
  • 三、源码演示

一、使用场景

  • 检测文件是否被篡改:
    在文件上传到服务器的时候,我们希望能够获得文件的指纹以确定文件没有被篡改过

  • 不存储重复文件信息:
    在文件上传到服务器的时候,为了节省服务器的存储空间,我们可以对文件指纹进行比对,存在的指纹文件,无需再次保存到文件服务器

二、加密算法

  1. 常用哈希算法:

    • MD4 1990 年,输出 128 位(已经不安全)
    • MD5 1991 年,输出 128 位(已经不安全)
    • SHA-0 1993 年 输出 160 位(发布之后很快就被 NSA 撤回,是 SHA-1 的前身)
    • SHA-1 1995 年,输出 160 位(已经不安全)
    • SHA-2 包括:SHA-224SHA-256SHA-384SHA-512,分别输出 224、256、384、512 位(目前安全)
  2. 哈希算法特点:

    • 正像快速:原始数据可以快速计算出哈希值
    • 逆向困难:通过哈希值基本不可能推导出原始数据
    • 输入敏感:原始数据只要有一点变动,得到的哈希值差别很大
    • 冲突避免:很难找到不同的原始数据得到相同的哈希值

三、源码演示

  1. 获取目标文件

    /*** 读取本地文件到比特数组** @param    file    文件对象* @return  byte[]  文件数组*/
    public static byte[] readRandomAccess(File file) throws IOException {// 1、使用 RandomAccessFile 打开文件管道FileChannel channel = new RandomAccessFile(file, "r").getChannel();int fileSize = (int) channel.size();try {// 2、创建 MappedByteBuffer,并使用 NIO 管道进行数据映射,加载数据到物理内存//load(): 将此缓冲区的内容加载到物理内存中。此方法尽最大努力确保当它返回时,缓冲区的内容驻留在物理内存中。调用此方法可能会导致出现一些页面错误和I/O操作。MappedByteBuffer buffer = channel.map(FileChannel.MapMode.READ_ONLY, 0, fileSize).load();//remaining() 返回当前位置和限制之间的元素数。此缓冲区中剩余的元素数byte[] result = new byte[fileSize];if (buffer.remaining() > 0) {// 3、读取数据到 byte 数组中buffer.get(result, 0, fileSize);}buffer.clear();return result;} finally {closeChannel(channel);}
    }private static void closeChannel(FileChannel channel) {try {channel.close();} catch (IOException e) {e.printStackTrace();}
    }
    
  2. 采用 MD5 哈希

    /*** 生成文件 MD5 指纹** @param  fileData            文件内容比特数组* @return  java.lang.String    文件内容 MD5 指纹*/
    public static String generateFileMd5Hash(byte[] fileData) {return DigestUtils.md5Hex(fileData);
    }
    

    P.S

    DigestUtils.md5Hex 有很多重载,可以根据实际情况选择

  3. 采用 SHA 哈希

    /*** 生成文件 SHA 指纹** @param   fileData            文件内容比特数组* @return  java.lang.String    文件内容 SHA 指纹*/
    public static String generateFileSha256Hash(byte[] fileData) {return DigestUtils.sha256Hex(fileData);
    }
    

    P.S

    DigestUtils.sha256Hex 有很多重载,可以根据实际情况选择

  4. 演示结果

    public static void main(String[] args) throws IOException {File file = new File("/Users/rambo/Desktop/1.txt");byte[] bytes = readRandomAccess(file);String md5Hash = generateFileMd5Hash(bytes);String shaHash = generateFileSha256Hash(bytes);System.out.println("MD5 指纹:" + md5Hash);System.out.println("SHA 指纹:" + shaHash);
    }
    
    MD5 指纹:0615ce4d9d3c12bf493bab656dd65dd0
    SHA 指纹:b1f63d223f7c733b62243d7f55961ab4ad38d92ec413a03c7bed51288aa22323
    

JAVA 获取文件指纹相关推荐

  1. Java 查看文件绝对路径,JAVA获取文件绝对路径的方法

    本文实例讲述了JAVA获取文件绝对路径的方法.分享给大家供大家参考.具体实现方法如下: /** * 获取一个类的class文件所在的绝对路径. 这个类可以是JDK自身的类,也可以是用户自定义的类,或者 ...

  2. 用Java获取文件的MD5校验和

    我正在寻找使用Java获取文件的MD5校验和. 我真的很惊讶,但是我找不到任何能显示如何获取文件的MD5校验和的东西. 怎么做? #1楼 Guava现在提供了一个新的,一致的哈希API,它比JDK中提 ...

  3. 如何获取服务器上文件的hashcode,java获取文件hashcode

    java获取文件hashcode [2021-02-05 18:36:57]  简介: php去除nbsp的方法:首先创建一个PHP代码示例文件:然后通过"preg_replace(&quo ...

  4. Java获取文件路径

    Java获取文件路径 1.获取当前文件所在的包名 2.获取工程文件夹所在的绝对路径 3.获取当前class文件所在的绝对路径 1.获取当前文件所在的包名 类名.class.getPackage().g ...

  5. java 获取文件扩展名_如何在Java中获取文件扩展名

    java 获取文件扩展名 Sometimes while working with files, we need to process them differently based on their ...

  6. java获取文件编码

    目录 1. 概述 2. 编码基本知识 2.1. iso8859-1 2.2. GB2312/GBK 2.3. unicode 2.4. UTF 3.JAVA中移位运算>> , <&l ...

  7. java获取文件列表,[javaSE] java获取文件列表

    递归测试 import java.io.File; import java.util.ArrayList; import java.util.HashMap; import java.util.Lis ...

  8. java 获取文件夹下所有文件

    java 获取文件夹下所有文件 以下两个函数实现获取文件夹下所有文件 /*** 获取指定文件夹下所有文件,不含文件夹里的文件** @param dirFilePath 文件夹路径* @return*/ ...

  9. java获取文件和照片创建时间

    java获取文件创建时间 获取文件创建时间 获取照片创建时间 由于要获取照片创建的时间,也就是数字化的时间,即拍摄时间:开始通过网上搜索的获取文件时间都是本机电脑创建此文件的时间,路子不对,不符合要求 ...

  10. java 获取文件权限_Java中的文件权限,检查权限和更改权限 - Break易站

    Java提供了许多方法调用来检查和更改文件的权限,例如可以将只读文件更改为具有写入权限.当用户想要限制文件允许的操作时,需要更改文件权限.例如,文件权限可以从写入更改为只读,因为用户不再想要编辑文件. ...

最新文章

  1. 3D机器人视觉在仓储物流和工业自动化领域的应用 | AI ProCon 2019
  2. opencv投影变换
  3. 在离线环境中安装Visual Stuido 2017
  4. 9个元素换6次达到排序序列_(算法四)高级排序(快速排序)
  5. Python 命令行之旅:深入 click 之参数篇
  6. SXSSFWorkbook使用——使用excel模板
  7. java继承父类执行顺序_java中子类继承父类程序执行顺序问题
  8. 老款 iPhone 涨价;微软 AI 研究院落户上海;刘强东不参加人工智能大会 | 极客头条...
  9. c语言不能正确输出最小值,C语言综合测试.doc
  10. PHP常用正则类(全)
  11. 科创人·黑湖科技CEO周宇翔:To B产品不应忽视产品体验,制造业的未来是需求定义生产
  12. java myqq ui,MYQQ JAVA语言开发的QQ聊天系统,可以添加,删除,好友,支持在线,离线发送消 能 文 ICQ-IM-Chat 238万源代码下载- www.pudn.com...
  13. 利用Apache Tika分页解析pdf文件内容
  14. python except exception_Python 获取异常(Exception)信息的几种方法
  15. QQ被盗恢复原来QQ的好友有妙招
  16. centos linux引导修复_Linux 引导修复
  17. Yonex 各系列球拍指数
  18. 计算机考研考电路学校,集成电路工程考研学校排名
  19. 华字后面配什么字比较好_和华字搭配的男孩名字 华后面取什么名字男孩 带华字好听好寓意男孩名...
  20. cg of spears storm_Steam 上的 Storm Of Spears RPG

热门文章

  1. ThinkPad SL400无线网卡的问题
  2. SECRET文件保险柜 V2.7 --统一管理并加密文件
  3. sqliteman安装时出现The following packages have unmet dependencies: libqtgui4 : Depends: libpng12-0错误
  4. 使用阿里云Ubuntu搭建代理服务器
  5. 电视家3.0怎么安装到电视上?常用三种方法介绍
  6. (总结归纳)常用电子元件,封装,库
  7. 1.6万亿参数的语言模型:谷歌大脑提出Switch Transformer,预训练速度可达T5的7倍
  8. 51单片机自学笔记(三)——电子电路基础
  9. 深度学习论文阅读目标检测篇(六)中英对照版:YOLOv3《 An Incremental Improvement》
  10. 制作学术PPT的注意事项如何制作模板(附模板下载链接)