首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >生成文件的MD5散列,并从导入txt文件与MD5哈希值进行比较。

生成文件的MD5散列,并从导入txt文件与MD5哈希值进行比较。
EN

Stack Overflow用户
提问于 2021-07-20 11:31:31
回答 1查看 273关注 0票数 0

,有人能帮我吗?python的初学者,但需要高级脚本来进行哈希检查(我的想法是让脚本将每个文件哈希值与"malicious_hash.txt如果匹配,然后打印找到“)进行比较)

代码语言:javascript
复制
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")
EN

回答 1

Stack Overflow用户

发布于 2021-08-07 09:58:15

我对你的问题有两个问题。首先,尚不清楚"malicious.hash.txt“是否包含散列,或者某些需要散列的内容;第二,您的处理方式非常不寻常:您通常在某种安全的通道上接收到一个散列,然后接收一个文件并计算它的散列,以检查它是否与您已经拥有的哈希相同,因此您可以确定您的文件没有被篡改。

这就是说,让我们看看您的代码做了什么(既然您说您是初学者),以及如何修改它。

代码语言:javascript
复制
import os
import hashlib

好的,我们导入我们需要的模块。

代码语言:javascript
复制
hashtype = "MD5"
malicious_hash = ("C:/Users/user/Downloads/malicious_hash.txt")

第一行是无用的:您设置了一个您从未使用过的变量,所以让我们删除它。第二行中的括号也是无用的。顺便说一句,通常情况下,将函数定义放在任何实际“做某事”的代码之前是很好的做法,所以我们将在函数定义之后移动这段代码和下一段代码。

代码语言:javascript
复制
with open(malicious_hash, 'rb')as f:
  lines = f.readlines()
  print(lines)

这将以二进制方式打开文件,然后调用readlines() -它返回行的list (由行终止符分隔),所以这里有问题。如果我们假设该文件包含一个散列,我们可以简单地使用read(),也许可以将变量重命名为可读性:malicious_hash_file作为文件名,malicious_hash用于read()调用的输出。

代码语言:javascript
复制
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块为单位,在每次读取后更新哈希,然后返回完整的哈希。

代码语言:javascript
复制
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返回的散列是否等于我们已经拥有的恶意散列如果是的话,我们将与文件名一起打印一条警告消息,如果不是,我们将继续进行下一次迭代。

代码语言:javascript
复制
cal_folder_hash("C:/Users/user/Downloads")

好的,我们终于调用了我们的主要功能。

因此,修改后的代码应该类似于

代码语言:javascript
复制
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")
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68454119

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档