J'ai cette erreur:
Traceback (most recent call last):
File "python_md5_cracker.py", line 27, in <module>
m.update(line)
TypeError: Unicode-objects must be encoded before hashing
quand j'essaye d'exécuter ce code dans Python 3.2.2 :
import hashlib, sys
m = hashlib.md5()
hash = ""
hash_file = input("What is the file name in which the hash resides? ")
wordlist = input("What is your wordlist? (Enter the file name) ")
try:
hashdocument = open(hash_file,"r")
except IOError:
print("Invalid file.")
raw_input()
sys.exit()
else:
hash = hashdocument.readline()
hash = hash.replace("\n","")
try:
wordlistfile = open(wordlist,"r")
except IOError:
print("Invalid file.")
raw_input()
sys.exit()
else:
pass
for line in wordlistfile:
m = hashlib.md5() #flush the buffer (this caused a massive problem when placed at the beginning of the script, because the buffer kept getting overwritten, thus comparing incorrect hashes)
line = line.replace("\n","")
m.update(line)
Word_hash = m.hexdigest()
if Word_hash==hash:
print("Collision! The Word corresponding to the given hash is", line)
input()
sys.exit()
print("The hash given does not correspond to any supplied Word in the wordlist.")
input()
sys.exit()
Il recherche probablement un caractère encodant à partir de wordlistfile
.
wordlistfile = open(wordlist,"r",encoding='utf-8')
Ou, si vous travaillez ligne par ligne:
line.encode('utf-8')
Vous devez avoir à définir encoding format
comme utf-8
, Essayez ce moyen facile
Cet exemple génère un nombre aléatoire à l'aide de l'algorithme SHA256:
>>> import hashlib
>>> hashlib.sha256(str(random.getrandbits(256)).encode('utf-8')).hexdigest()
'cd183a211ed2434eac4f31b317c573c50e6c24e3a28b82ddcb0bf8bedf387a9f'
Pour stocker le mot de passe (PY3):
import hashlib, os
password_salt = os.urandom(32).hex()
password = '12345'
hash = hashlib.sha512()
hash.update(('%s%s' % (password_salt, password)).encode('utf-8'))
password_hash = hash.hexdigest()
L'erreur dit déjà ce que vous devez faire. MD5 fonctionne sur des octets, vous devez donc coder une chaîne Unicode en bytes
, par exemple avec line.encode('utf-8')
.
S'il vous plaît jetez un coup d'oeil d'abord à que réponse.
Maintenant, le message d'erreur est clair: vous ne pouvez utiliser que des octets, pas des chaînes Python (ce qui était unicode
dans Python <3), vous devez donc coder les chaînes avec votre codage préféré: utf-32
, utf-16
, utf-8
ou même l’un des codages à 8 bits restreints (que certains pourraient appeler des pages de codes).
Les octets de votre fichier de liste de mots sont automatiquement décodés en Unicode par Python 3 au fur et à mesure de la lecture du fichier. Je vous suggère de faire:
m.update(line.encode(wordlistfile.encoding))
de sorte que les données encodées poussées vers l'algorithme md5 soient encodées exactement comme le fichier sous-jacent.
Vous pouvez ouvrir le fichier en mode binaire:
import hashlib
with open(hash_file) as file:
control_hash = file.readline().rstrip("\n")
wordlistfile = open(wordlist, "rb")
# ...
for line in wordlistfile:
if hashlib.md5(line.rstrip(b'\n\r')).hexdigest() == control_hash:
# collision
import hashlib
string_to_hash = '123'
hash_object = hashlib.sha256(str(string_to_hash).encode('utf-8'))
print('Hash', hash_object.hexdigest())
encoder cette ligne l'a corrigé pour moi.
m.update(line.encode('utf-8'))