,有人能帮我吗?python的初学者,但需要高级脚本来进行哈希检查(我的想法是让脚本将每个文件哈希值与"malicious_hash.txt如果匹配,然后打印找到“)进行比较)
import os
import hashlib
hashtype = "MD5"
malicious_hash = ("C:/Users/user/Downloads/malicious_hash.txt")
with open(malicious_hash, 'rb')as f:
lines = f.readlines()
print(lines)
def cal_file_md5(filt_path):
with open(filt_path, "rb") as f:
file_hash = hashlib.md5()
while chunk := f.read(1024 * 1024):
file_hash.update(chunk)
return file_hash.hexdigest()
def cal_folder_hash(folder):
if not os.path.exists(folder):
print("Folder doesn't exist %s" % folder)
return
for file in os.listdir(folder):
path = os.path.join(folder, file)
if os.path.isdir(path):
cal_folder_hash(path)
else:
print("File: %s" % path)
md5 = cal_file_md5(path)
print("MD5: %s\n" % md5)
cal_folder_hash("C:/Users/user/Downloads")发布于 2021-08-07 09:58:15
我对你的问题有两个问题。首先,尚不清楚"malicious.hash.txt“是否包含散列,或者某些需要散列的内容;第二,您的处理方式非常不寻常:您通常在某种安全的通道上接收到一个散列,然后接收一个文件并计算它的散列,以检查它是否与您已经拥有的哈希相同,因此您可以确定您的文件没有被篡改。
这就是说,让我们看看您的代码做了什么(既然您说您是初学者),以及如何修改它。
import os
import hashlib好的,我们导入我们需要的模块。
hashtype = "MD5"
malicious_hash = ("C:/Users/user/Downloads/malicious_hash.txt")第一行是无用的:您设置了一个您从未使用过的变量,所以让我们删除它。第二行中的括号也是无用的。顺便说一句,通常情况下,将函数定义放在任何实际“做某事”的代码之前是很好的做法,所以我们将在函数定义之后移动这段代码和下一段代码。
with open(malicious_hash, 'rb')as f:
lines = f.readlines()
print(lines)这将以二进制方式打开文件,然后调用readlines() -它返回行的list (由行终止符分隔),所以这里有问题。如果我们假设该文件包含一个散列,我们可以简单地使用read(),也许可以将变量重命名为可读性:malicious_hash_file作为文件名,malicious_hash用于read()调用的输出。
def cal_file_md5(filt_path):
with open(filt_path, "rb") as f:
file_hash = hashlib.md5()
while chunk := f.read(1024 * 1024):
file_hash.update(chunk)
return file_hash.hexdigest()这个是正确的:它读取文件"filt_path“(可能是"file_path”吗?)以1MB块为单位,在每次读取后更新哈希,然后返回完整的哈希。
def cal_folder_hash(folder):
if not os.path.exists(folder):
print("Folder doesn't exist %s" % folder)
return
for file in os.listdir(folder):
path = os.path.join(folder, file)
if os.path.isdir(path):
cal_folder_hash(path)
else:
print("File: %s" % path)
md5 = cal_file_md5(path)
print("MD5: %s\n" % md5)这是最有趣的部分:它检查文件夹folder是否存在,然后扫描其内容。当它找到一个子文件夹(os.path.isdir)时,它在子文件夹上递归地调用自己;当它找到一个正常的文件时,它在该文件上调用cal_file_md5。我们需要添加的只是检查cal_file_md5返回的散列是否等于我们已经拥有的恶意散列如果是的话,我们将与文件名一起打印一条警告消息,如果不是,我们将继续进行下一次迭代。
cal_folder_hash("C:/Users/user/Downloads")好的,我们终于调用了我们的主要功能。
因此,修改后的代码应该类似于
import os
import hashlib
def cal_file_md5(file_path):
with open(file_path, "rb") as f:
file_hash = hashlib.md5()
while chunk := f.read(1024 * 1024):
file_hash.update(chunk)
return file_hash.hexdigest()
def cal_folder_hash(folder):
if not os.path.exists(folder):
print("Folder doesn't exist %s" % folder)
return
for file in os.listdir(folder):
path = os.path.join(folder, file)
if os.path.isdir(path):
cal_folder_hash(path)
else:
md5 = cal_file_md5(path)
if md5 == malicious_hash:
print("Malicious File found: %s" % path)
malicious_hash_file = "C:/Users/user/Downloads/malicious_hash.txt"
with open(malicious_hash_file, 'rb')as f:
malicious_hash = f.read()
cal_folder_hash("C:/Users/user/Downloads")https://stackoverflow.com/questions/68454119
复制相似问题