#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» если это совпадение, выведите «Совпадение» и путь.