TransWikia.com

Не могу понять в чем ошибка (hashlib)

Stack Overflow на русском Asked by NeonGhost084 on November 10, 2021

Создаю программу для брута хешей

Входные данные : 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())

One Answer

Как правильно заметил 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())

Answered by insolor on November 10, 2021

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP