Tips:

下方代码使用了f-string格式化字符串使用Python3.6以下运行时,请修改字符串格式化方法!

文件完整性校验的作用

对于开发的程序,为了防止他人纂改,一般通过哈希算法(md5,sha1,sha256)进行文件的完整性校验

一般校验文件我们会对小型文件和大型文件进行区分

① 如果是小型文件,可以直接通过for循环读取字节流,对所有字节流进行hash加密获取哈希值即可

② 对于大型文件,我们一般会将文件分成多个块

例如: 一个1000字节的文件,分成10块,每次从100,200,300......字节分别读取50字节并连接起来进行哈希计算即可

1. 对于小型文件

本代码仅实现对文件md5值的获取,如果实现密码比较,直接通过布尔运算即可

### 小型文件校验
### 创建两个文本文件,其中第二个文件多了一个字符串8
import hashlib
import os.pathdef check_small_file(file_path, enc_type=hashlib.md5()):"""该方法会通过for循环以字节流读取文件并且通过updata方法添加到md5对象中进行校验如果用于大文件,则会校验很慢:param file_path 文件路径:param enc_type 加密方式,传入hashlib方法"""enc_obj = enc_typewith open(file_path, 'rb') as f:for line in f:enc_obj.update(line)return enc_obj.hexdigest()

2. 对于大型文件

大型文件我们需要先获取文件的字节数量,获取字节数量有两种方法进行获取

获取后按照我们需要进行分段的个数,进行整除,然后移动文件指针即可实现分段读取

# 大型文件校验
def check_big_file(file_path: str, check_frequency: int = 10, check_once_bytes=100, enc_type=hashlib.md5()):"""该方法用于大文件校验通过seek方法移动文件指针保证对文件每10%的地方进行一次读取,并校验其完整性!:param file_path 文件路径:param check_frequency 校验次数默认10,填写几次则会分个区间去读取并校验:check_once_bytes 单次校验字节,默认100个字节:param enc_type 加密方式,传入hashlib方法:tips 如果文件过小,可能会出现校验出错的文件,所以该方法一般用于大型文件校验"""# 获取文件的字节数(方法1)file_bytes = os.path.getsize(file_path)enc_obj = enc_typewith open(file_path, 'rb') as f:# 获取文件的字节数(方法2)f.seek(0, 2)  # 将文件指针移动到末尾file_bytes = f.tell()  # 获取末尾的指针值 -> 字节总数check_bytes = file_bytes // check_frequency  # 每次移动的文件字节数for i in range(check_frequency):f.seek(check_bytes * i, 0)enc_obj.update(f.read(check_once_bytes))return enc_obj.hexdigest()

3.将上述代码进行整合就可以实现大小文件校验,并且支持多个哈希算法

完整实例如下:

这里就不再写布尔运算了,只要获得加密值就可以了

# coding: utf-8
# @Author: Ruan
# coding:utf-8### 对于开发后的程序为了防止被人篡改
### 可以使用b模式将文件读取后
### 对文件进行hash处理
### 仅需要对照结果与我们开发时计算的结果是否相同即可
### 并且结果仅需要一串md5值即可### 小型文件校验
### 创建两个文本文件,其中第二个文件多了一个字符串8
import hashlib
import os.pathdef check_small_file(file_path, enc_type=hashlib.md5()):"""该方法会通过for循环以字节流读取文件并且通过updata方法添加到md5对象中进行校验如果用于大文件,则会校验很慢:param file_path 文件路径:param enc_type 加密方式,传入hashlib方法"""enc_obj = enc_typewith open(file_path, 'rb') as f:for line in f:enc_obj.update(line)return enc_obj.hexdigest()def check_big_file(file_path: str, check_frequency: int = 10, check_once_bytes=100, enc_type=hashlib.md5()):"""该方法用于大文件校验通过seek方法移动文件指针保证对文件每10%的地方进行一次读取,并校验其完整性!:param file_path 文件路径:param check_frequency 校验次数默认10,填写几次则会分个区间去读取并校验:param enc_type 加密方式,传入hashlib方法:tips 如果文件过小,可能会出现校验出错的文件,所以该方法一般用于大型文件校验"""# 获取文件的字节数(方法1)file_bytes = os.path.getsize(file_path)enc_obj = enc_typewith open(file_path, 'rb') as f:# 获取文件的字节数(方法2)f.seek(0, 2)  # 将文件指针移动到末尾file_bytes = f.tell()  # 获取末尾的指针值 -> 字节总数check_bytes = file_bytes // check_frequency  # 每次移动的文件字节数for i in range(check_frequency):f.seek(check_bytes * i, 0)enc_obj.update(f.read(check_once_bytes))return enc_obj.hexdigest()if __name__ == '__main__':initial_file = '.\\files\\原文件.txt'modify_file = '.\\files\\被修改的文件.txt'md5_init = check_small_file(initial_file)md5_modify = check_small_file(modify_file)print(f'初始文件md5:{md5_init}\n修改后文件md5:{md5_modify}')# 尽管只多了一个字符串8,但是结果却完全不相同print(f'使用md5进行节选(大型文件)完整性校验获取的md5值:{check_big_file(initial_file)}')print(f'使用sha256进行节选(大型文件)完整性校验获取的sha256值:{check_big_file(initial_file,enc_type=hashlib.sha256())}')

Python通过哈希算法实现文件完整性校验-以及大型文件完整性校验相关推荐

  1. 用 Python 实现哈希算法检测重复图片

    用 Python 实现哈希算法检测重复图片 - 简书 Python实现哈希算法,并检测图片重复的教程_Steven_ycs的博客-CSDN博客_python实现哈希

  2. python hashlib 哈希算法

    写在篇前 ​ 哈希加密算法应用非常广泛,包括数字签名,身份验证,操作检测,指纹,校验和(消息完整性检查),哈希表,密码存储等.在密码学中,好的哈希算法应该满足以下两个条件:一是无法从哈希值解密原始消息 ...

  3. python检测图片相同部分_用 Python 实现哈希算法检测重复图片

    在 Python 中导入 hashlib 模块,调用函数就可以生成某一个字符串或者文件的哈希值.这个算法对于未被篡改的上传文件非常有效,如果输入数据有细微变化,加密哈希算法都会导致雪崩效应,从而造成新 ...

  4. java spring js文件_005-html+js+spring multipart文件上传

    一.概述 需求:通过html+js+java上传最大500M的文件,需要做MD5 消息摘要以及SHA256签名,文件上传至云存储 1.1.理解http协议 https://www.cnblogs.co ...

  5. 通过python利用哈希值实现比较两个文件的一致性

    背景 近来学习到python的内置函数hash(),深入发现通过python的哈希值可以做很多的事情,最典型的可能就是文件加密了,在我们现实生活中大约有如下一些用途: 加密网站注册用户的密码. 网站用 ...

  6. 相似图片检测:感知哈希算法之aHash,dHash,pHash的Python实现

    相似图片检测:感知哈希算法之aHash,dHash,pHash的Python实现 原文:http://blog.sina.com.cn/s/blog_56fd58ab0102xpqf.html 感知哈 ...

  7. 相似图片检测:感知哈希算法之dHash的Python实现

    原文:https://blog.csdn.net/haluoluo211/article/details/52769325 相似图片检测:感知哈希算法之dHash的Python实现 某些情况下,我们需 ...

  8. Python之网络爬虫(selenium爬取动态网页、爬虫案例分析、哈希算法与RSA加密)

    文章目录 一.selenium爬取动态网页 二.爬虫案例分析 三.哈希hash算法与RSA加密 一.selenium爬取动态网页 1.动态网页认知 爬虫其实就是在模仿浏览器的行为 应对要多次数据的交互 ...

  9. python查重算法_用Python实现通过哈希算法检测图片重复的教程

    Iconfinder 是一个图标搜索引擎,为设计师.开发者和其他创意工作者提供精美图标,目前托管超过 34 万枚图标,是全球最大的付费图标库.用户也可以在 Iconfinder 的交易板块上传出售原创 ...

  10. python图像检测_用Python实现通过哈希算法检测图片重复的教程

    Iconfinder 是一个图标搜索引擎,为设计师.开发者和其他创意工作者提供精美图标,目前托管超过 34 万枚图标,是全球最大的付费图标库.用户也可以在 Iconfinder 的交易板块上传出售原创 ...

最新文章

  1. 关于产品体验以及产品会被抄袭的思考
  2. html渐变色CSS3 渐变,如何实现css3渐变色,css3渐变色怎么写
  3. HDU 4162 Shape Number(最小表示法)
  4. ftpwebrequest 无法加载或初始化请求的服务提供程序_jvm之类加载机制
  5. 武汉理工大学计算机学院2018复试,武汉理工大学2018年自主招生复试揭秘
  6. Ubuntu Linux服务器安装HBase
  7. AWS中国区同时上线两款新产品,补齐存储服务“全家桶”!
  8. C++多继承构造和析构顺序
  9. python—列表,元组,字典
  10. html在新网页输出结果是,JavaScript考试试卷
  11. 软考初级程序员---题目(五)
  12. win10更新后没有计算机了,win10更新后 ,没有处理器电源管理怎么办?
  13. TensorFlow 2.10 Unable to register cuBLAS factory Attempting to register factory for plugin cuBLAS方案
  14. 饥荒联机版steam专用服务器创建
  15. Linux内存管理(四十):Linux PSI 详解
  16. TMT: A Transformer-based Modal Translator for Improving Multimodal Sequence Representations in Audio
  17. POJ - 2008 Moo University - Team Tryouts
  18. 堰流实验报告思考题_水力学的实验报告2篇
  19. quartusii verilog语言create bsf文件的问题
  20. 服务器虚拟化课程总结,虚拟化与云计算课程总结报告

热门文章

  1. Tkinter:事件绑定
  2. 2021-2025年中国共享Web托管服务行业市场供需与战略研究报告
  3. Java:打包成jar包
  4. java 月份缩写_实训汇编语言设计——输入1-12 ,显示月份缩写
  5. 双系统linux开机黑屏,解决双系统中ubuntu开关机异常,黑屏,出现“nouveau , SCHED_ERROR”字样等的问题...
  6. 小程序实现文字竖排展示
  7. Qt实战案例(54)——利用QPixmap设计图片透明度
  8. Axure中移动的绝对位置
  9. Sqlite日期查询
  10. mac上安装brew(最简易)