我遇到此错误:

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


当我尝试在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:
  # 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)
  m = hashlib.md5()
  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()


评论

我发现用'rb'打开文件对我的案子有帮助。

#1 楼

它可能正在寻找来自wordlistfile的字符编码。

wordlistfile = open(wordlist,"r",encoding='utf-8')


或者,如果您逐行工作:

line.encode('utf-8')


评论


open(wordlist,“ r”,encoding ='utf-8')为什么使用带有特定编码的open,编码指定为解码编解码器,如果没有此选项,则使用平台相关编码。

–吴丹(Tanky Woo)
16年1月19日,下午1:05

#2 楼

您必须像encoding format这样定义utf-8
尝试这种简单的方法,

本示例使用SHA256算法生成一个随机数:

#3 楼

import hashlib
string_to_hash = '123'
hash_object = hashlib.sha256(str(string_to_hash).encode('utf-8'))
print('Hash', hash_object.hexdigest())


评论


hashlib.sha256方法始终期望使用unicode。在Python-2中,str既是str又是unicode,因此只需传递用于正常工作的string_to_hash即可。但是,在Python-3中,字符串(文本,此处为string_to_hash)和unicode是两种不同的类型。因此,当我们仅传递string_to_hash(属于文本类型)时,它将引发错误,指出需要unicode值。

–昆丹
20-10-29在20:17

#4 楼

要存储密码(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()


评论


此行使密码无法使用。 password_salt = os.urandom(32).hex()它应为固定的已知值,但只能对服务器保密。请更正我或使其适应您的代码。

–睫毛
18/12/12在15:51



我同意@Yash您可以为每个哈希使用一个单一的盐(不是最好的盐),或者为每个哈希生成一个随机的盐,则必须将其与哈希一起存储以供以后再次使用以进行比较

–卡森·埃文斯(Carson Evans)
19年1月9日在18:14



#5 楼

该错误已说明您必须执行的操作。 MD5对字节进行操作,因此您必须将Unicode字符串编码为bytes,例如与line.encode('utf-8')

#6 楼

请首先查看该答案。

现在,错误消息很清楚:您只能使用字节,而不能使用Python字符串(在Python <3中曾经是unicode),因此您必须使用您喜欢的编码对字符串进行编码:utf-32utf-16utf-8或什至是受限的8位编码之一(有些可能称为代码页)。

单词列表文件中的字节会自动解码为从文件读取Python 3的Unicode。我建议您这样做:

m.update(line.encode(wordlistfile.encoding))


,以便推送到md5算法的编码数据的编码方式与基础文件完全相同。

#7 楼

将此行编码为我修复。

m.update(line.encode('utf-8'))


#8 楼

您可以以二进制模式打开文件:

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


#9 楼

如果是单行字符串。用b或B包裹它。例如:

variable = b"This is a variable"




variable2 = B"This is also a variable"


#10 楼

该程序是上述MD5破解程序的无错误和增强版本,它读取包含哈希密码列表的文件,并根据英语词典单词列表中的哈希单词检查该文件。希望对您有所帮助。

我从以下链接下载了英语词典
https://github.com/dwyl/english-words

# md5cracker.py
# English Dictionary https://github.com/dwyl/english-words 

import hashlib, sys

hash_file = 'exercise\hashed.txt'
wordlist = 'data_sets\english_dictionary\words.txt'

try:
    hashdocument = open(hash_file,'r')
except IOError:
    print('Invalid file.')
    sys.exit()
else:
    count = 0
    for hash in hashdocument:
        hash = hash.rstrip('\n')
        print(hash)
        i = 0
        with open(wordlist,'r') as wordlistfile:
            for word in wordlistfile:
                m = hashlib.md5()
                word = word.rstrip('\n')            
                m.update(word.encode('utf-8'))
                word_hash = m.hexdigest()
                if word_hash==hash:
                    print('The word, hash combination is ' + word + ',' + hash)
                    count += 1
                    break
                i += 1
        print('Itiration is ' + str(i))
    if count == 0:
        print('The hash given does not correspond to any supplied word in the wordlist.')
    else:
        print('Total passwords identified is: ' + str(count))
sys.exit()