Создайте хэш MD5 файла и сравните его со значением хэша MD5 из файла импорта txt

#python #python-3.x #python-2.7 #hash #md5

Вопрос:

Кто-нибудь может мне в этом помочь? Новичок в 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: %sn" % md5)

cal_folder_hash("C:/Users/user/Downloads")

 

Комментарии:

1. Где ты застрял? Похоже, вы правильно поняли всю сложную часть, вам нужно только сравнить md5 каждого возвращаемого файла cal_file_md5() с «вредоносным» и распечатать имя файла и/или «найдено совпадение», когда они равны, вместо того, чтобы просто печатать имя и хэш-значение

2. Да, весь сценарий взят откуда-то еще, я все еще понимаю, что говорит код, но я понятия не имею, как его объединить и сравнить заданное значение хэша с «malicious_hash.txt» к файлу, и если он совпадет, на нем появится надпись «СОВПАДЕНИЕ!» Если вы программист, можете ли вы дать мне какой-нибудь совет или руководство?

Ответ №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)
 

Это открывает файл в двоичном виде, но затем вызывает readlines() — который возвращает a 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»?) кусками по 1 МБ, обновляет хэш после каждого чтения, а затем возвращает полный хэш.

 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: %sn" % 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")
 

Комментарии:

1. Извините за неясный вопрос. «malicious_hash.txt» содержит всю вредоносную строку хэш-значения md5. Я хочу, чтобы хэш-значение было внутри «malicious_hash.txt» сравните с хэш-значением всего файла, включающим рекурсивный путь «C:/Users/user/Downloads» если это совпадение, выведите «Совпадение» и путь.