Python通过哈希算法实现文件完整性校验-以及大型文件完整性校验
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通过哈希算法实现文件完整性校验-以及大型文件完整性校验相关推荐
- 用 Python 实现哈希算法检测重复图片
用 Python 实现哈希算法检测重复图片 - 简书 Python实现哈希算法,并检测图片重复的教程_Steven_ycs的博客-CSDN博客_python实现哈希
- python hashlib 哈希算法
写在篇前 哈希加密算法应用非常广泛,包括数字签名,身份验证,操作检测,指纹,校验和(消息完整性检查),哈希表,密码存储等.在密码学中,好的哈希算法应该满足以下两个条件:一是无法从哈希值解密原始消息 ...
- python检测图片相同部分_用 Python 实现哈希算法检测重复图片
在 Python 中导入 hashlib 模块,调用函数就可以生成某一个字符串或者文件的哈希值.这个算法对于未被篡改的上传文件非常有效,如果输入数据有细微变化,加密哈希算法都会导致雪崩效应,从而造成新 ...
- java spring js文件_005-html+js+spring multipart文件上传
一.概述 需求:通过html+js+java上传最大500M的文件,需要做MD5 消息摘要以及SHA256签名,文件上传至云存储 1.1.理解http协议 https://www.cnblogs.co ...
- 通过python利用哈希值实现比较两个文件的一致性
背景 近来学习到python的内置函数hash(),深入发现通过python的哈希值可以做很多的事情,最典型的可能就是文件加密了,在我们现实生活中大约有如下一些用途: 加密网站注册用户的密码. 网站用 ...
- 相似图片检测:感知哈希算法之aHash,dHash,pHash的Python实现
相似图片检测:感知哈希算法之aHash,dHash,pHash的Python实现 原文:http://blog.sina.com.cn/s/blog_56fd58ab0102xpqf.html 感知哈 ...
- 相似图片检测:感知哈希算法之dHash的Python实现
原文:https://blog.csdn.net/haluoluo211/article/details/52769325 相似图片检测:感知哈希算法之dHash的Python实现 某些情况下,我们需 ...
- Python之网络爬虫(selenium爬取动态网页、爬虫案例分析、哈希算法与RSA加密)
文章目录 一.selenium爬取动态网页 二.爬虫案例分析 三.哈希hash算法与RSA加密 一.selenium爬取动态网页 1.动态网页认知 爬虫其实就是在模仿浏览器的行为 应对要多次数据的交互 ...
- python查重算法_用Python实现通过哈希算法检测图片重复的教程
Iconfinder 是一个图标搜索引擎,为设计师.开发者和其他创意工作者提供精美图标,目前托管超过 34 万枚图标,是全球最大的付费图标库.用户也可以在 Iconfinder 的交易板块上传出售原创 ...
- python图像检测_用Python实现通过哈希算法检测图片重复的教程
Iconfinder 是一个图标搜索引擎,为设计师.开发者和其他创意工作者提供精美图标,目前托管超过 34 万枚图标,是全球最大的付费图标库.用户也可以在 Iconfinder 的交易板块上传出售原创 ...
最新文章
- 关于产品体验以及产品会被抄袭的思考
- html渐变色CSS3 渐变,如何实现css3渐变色,css3渐变色怎么写
- HDU 4162 Shape Number(最小表示法)
- ftpwebrequest 无法加载或初始化请求的服务提供程序_jvm之类加载机制
- 武汉理工大学计算机学院2018复试,武汉理工大学2018年自主招生复试揭秘
- Ubuntu Linux服务器安装HBase
- AWS中国区同时上线两款新产品,补齐存储服务“全家桶”!
- C++多继承构造和析构顺序
- python—列表,元组,字典
- html在新网页输出结果是,JavaScript考试试卷
- 软考初级程序员---题目(五)
- win10更新后没有计算机了,win10更新后 ,没有处理器电源管理怎么办?
- TensorFlow 2.10 Unable to register cuBLAS factory Attempting to register factory for plugin cuBLAS方案
- 饥荒联机版steam专用服务器创建
- Linux内存管理(四十):Linux PSI 详解
- TMT: A Transformer-based Modal Translator for Improving Multimodal Sequence Representations in Audio
- POJ - 2008 Moo University - Team Tryouts
- 堰流实验报告思考题_水力学的实验报告2篇
- quartusii verilog语言create bsf文件的问题
- 服务器虚拟化课程总结,虚拟化与云计算课程总结报告
热门文章
- Tkinter:事件绑定
- 2021-2025年中国共享Web托管服务行业市场供需与战略研究报告
- Java:打包成jar包
- java 月份缩写_实训汇编语言设计——输入1-12 ,显示月份缩写
- 双系统linux开机黑屏,解决双系统中ubuntu开关机异常,黑屏,出现“nouveau , SCHED_ERROR”字样等的问题...
- 小程序实现文字竖排展示
- Qt实战案例(54)——利用QPixmap设计图片透明度
- Axure中移动的绝对位置
- Sqlite日期查询
- mac上安装brew(最简易)