【问题标题】:Generate MD5 hash of file and compare to MD5 hash value from import txt file生成文件的 MD5 哈希值并与导入 txt 文件中的 MD5 哈希值进行比较
【发布时间】:2021-09-27 22:06:55
【问题描述】:

有人可以帮我解决这个问题吗? python的初学者,但需要高级脚本来做哈希检查 (我的想法是让脚本将每个文件的哈希值与“malicious_hash.txt if match then print MATCH FOUND”进行比较)


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")

【问题讨论】:

  • 你卡在哪里了?您似乎已经完成了所有困难的部分,您只需将cal_file_md5() 返回的每个文件的 md5 与“恶意”的 md5 进行比较,并在它们相等时打印文件名和/或“找到匹配”,而不是只是打印名称和哈希值
  • 是的,整个脚本是从其他地方获取的,我仍然理解代码的内容,但我不知道如何组合它并将“malicious_hash.txt”中的给定哈希值与文件,如果匹配,它将显示“匹配!”如果你是程序员,能给我一些建议或指导吗?

标签: python python-3.x python-2.7 hash md5


【解决方案1】:

我对你的问题有两个问题。首先,不清楚“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)

这会以 binary 的形式打开文件,但随后会调用 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()

这个是正确的:它以 1 MB 的块读取文件“filt_path”(可能是“file_path”吗?),每次读取后更新哈希,然后返回完整的哈希。

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")

好的,我们终于调用了我们的 main 函数。

所以修改后的代码应该是这样的

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")

【讨论】:

  • 抱歉问题不清楚。 “malicious_hash.txt”是内容所有恶意md5哈希值字符串。我希望“malicious_hash.txt”中的哈希值与所有文件的哈希值进行比较,如果匹配打印“匹配”和路径,则在路径“C:/Users/user/Downloads”中包含递归。
猜你喜欢
  • 1970-01-01
  • 2016-08-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多