Не могу понять в чем ошибка (hashlib)
Создаю программу для брута хешей
Входные данные : d8578edf8458ce06fbc5bb76a58c5ca4 , wordlist.txt , md5
То что должно вывести : qwerty
Ошибка: AttributeError: 'str' object has no attribute 'hexdigest'
Когда убираю .hexdigest() из кода возникает ошибка : TypeError: can only concatenate str (not "_hashlib.HASH") to str
from colorama import Fore, init
import hashlib
init()
print ('Starting...')
# USER DATA
userhash = input ("Input HASH : ")
userword = input ("Input PassList : ")
useralg = input ("Input Algorithm : ")
# brute
wordlist = open(userword,"r",encoding='utf-8')
for line in wordlist:
hashpass = hashlib.new (useralg)
hashpass.update (line.encode("utf-8"))
if hashpass == userhash:
print (Fore.GREEN + line.hexdigest())
else:
print (Fore.RED + "PassErr", line.hexdigest())
После исправления все равно не работает, вывод программы:
PassErr c4ca4238a0b923820dcc509a6f75849b
PassErr e10adc3949ba59abbe56e057f20f883e
PassErr d8578edf8458ce06fbc5bb76a58c5ca4
Должно вывести qwerty
from colorama import Fore, init
import hashlib
init()
print ('Starting...')
# USER DATA
userhash = input ("Input HASH : ")
userword = input ("Input PassList : ")
useralg = input ("Input Algorithm : ")
# brute
wordlist = open(userword,"r",encoding='utf-8')
for line in wordlist:
hashpass = hashlib.new (useralg)
hashpass.update (line.rstrip('\n').encode("utf-8"))
if hashpass == userhash:
print (Fore.GREEN + hashpass.hexdigest())
else:
print (Fore.RED + "PassErr", hashpass.hexdigest())
Ответы (1 шт):
Как правильно заметил Sergey Gornostayev, вместо line.hexdigest() должно быть hashpass.hexdigest():
from colorama import Fore, init
import hashlib
init()
line = "some text"
useralg = "md5"
hashpass = hashlib.new(useralg)
hashpass.update(line.encode("utf-8"))
print(Fore.GREEN + hashpass.hexdigest())
# Выведет 552e21cd4cd9918678e3c1a0df491bc3 зеленым цветом
Также учитывайте, что строки прочитанные из файла заканчиваются на символ '\n', который нельзя ввести через input, поэтому хеши у вас при всем желании не совпадут. Нужно обрезать перенос строки из считанной строки, потом уже считать хеш:
wordlist = open(userword,"r",encoding='utf-8')
for line in wordlist:
hashpass = hashlib.new (useralg)
# обрезать перенос строки в конце, потом уже кодировать:
hashpass.update (line.rstrip('\n').encode("utf-8"))
if hashpass == userhash:
print (Fore.GREEN + hashpass.hexdigest())
else:
print (Fore.RED + "PassErr", hashpass.hexdigest())
По поводу второй ошибки: в Python не все объекты можно складывать между собой с помощью +. Ошибка говорит, что вы пытаетесь сложить объект строкового типа (Fore.GREEN - это строка '\x1b[32m') с объектом другого типа, что недопустимо. Аналогичная ошибка будет, если попытаться сложить строку с числом:
>>> print(Fore.GREEN + 100500)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: can only concatenate str (not "int") to str
can only concatenate str (not "int") to str
Чтобы устранить ошибку, можно например привести объект к строке:
print(Fore.GREEN + str(100500))
Но в данном случае это не то что вам нужно.
Обновление
Еще одна проблема: в условии if вы сравниваете объект hashpass (который не является строкой) с введенной пользователем строкой, поэтому условие никогда не выполнится. Чтобы работало правильно, нужно получить из hashpass значение хеша, и его уже сравнивать с введенным хешем.
if hashpass.hexdigest() == userhash:
print (Fore.GREEN + line) # Выводим саму строку, для которой подошел хеш
else:
print (Fore.RED + "PassErr", hashpass.hexdigest())