1、相关原理、技术分析
1.1、恶意代码(Malicious Code)
恶意代码是一种违背目标系统安全策略的程序代码,会造成目标系统信息泄露、资源滥用,破坏系统的完整性及可用性。它能够经过存储介质或网络进行传播,从一台计算机系统传到另外一台计算机系统,未经授权认证访问或破坏计算机系统。随着恶意代码成为信息安全的重要威胁,恶意代码检测技术成为信息安全领域的重要研究方向。目前已经有基于签名、启发式、行为式等几种检测恶意代码的方法,应用最广泛也是最成熟的当属基于签名的检测技术,当前研究的热点是能够检测未知恶意代码的基于数据挖掘和机器学习检测技术。
1.2、完整性验证
恶意代码感染、破坏其他目标的过程,也是破坏这些目标的完整性的过程。也是破坏这些目标完整性的过程。从另一方面说,保证了系统资源,特别是系统中重要资源的完整性不受破坏,就能够阻止恶意代码对系统资源的感染和破坏。校验和法是完整性控制技术队信息资源实现完整性保护的一种应用,系统在安装的时候会自动将硬盘中的所有文件资料做一次汇总并加入记录,将正常文件的内容计算校验和,将该校验和写入文件保存。定期的火灾文件使用前,检查文件现在内容计算出的校验和与原来保存的是否一致,因而可以发现是否感染。这种方法能够检测出已知和未知恶意代码,但由于恶意代码感染并非文件改变的唯一原因,软件版本升级、变更口令等正常程序也会引起文件更改,因而这种方法容易产生误报,影响文件的运行速度。
2、设计思路、算法描述
对于开发的程序,为了防止他人纂改,一般通过哈希算法(MD5,SHA1,SHA256)进行文件的完整性校验
一般校验文件我们会对小型文件和大型文件进行区分。
1、如果是小型文件,可以直接通过for循环读取字节流,对所有字节流进行hash加密获取哈希值即可。
2、 对于大型文件,我们一般会将文件分成多个块。
创建两个文本文件,一个用于小型文件完整性校验,一个用于大型文件完整性校验。
获取文件路径,计算文件的MD5的值,修改文件再计算文件的MD5的值,对比两次MD5的值是否一致,如果一致说明文件没有被修改,否则文件被篡改。
3、详细实现(代码必须注释)
import hashlib
import os.path
def check_small_file(file_path):
"""
该方法会通过for循环以字节流读取文件
并且通过updata方法添加到md5对象中进行校验
如果用于大文件,则会校验很慢
param file_path 文件路径
"""
fp = open(file_path)
value = fp.read()
x = hashlib.md5()
x.update(value.encode('utf-8'))
fp.close()
return x.hexdigest()
if __name__ == '__main__':
initial_file = './mldzr.txt'
modify_file = './mldzrg.txt'
md5_init = check_small_file(initial_file)
md5_modify = check_small_file(modify_file)
print(f'初始文件md5:{md5_init}\n修改后文件md5:{md5_modify}')
if(md5_init == md5_modify):
print("文件未被篡改")
else:
print("文件被篡改")
4、程序测试、结果分析
后面一个文件比前面一个文件就删除几个字
首先是两个文件对比,两个文件内容不一样,MD5的值会有天差地别的区别,说明文件被篡改
现在是同一个文件对比,文件内容一样,MD5的值一定一样,说明文件没有被篡改