web-dev-qa-db-ja.com

TypeErrorを修正する方法:Unicodeオブジェクトはハッシュの前にエンコードされなければならませんか?

私はこのエラーがあります:

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()
215
JohnnyFromBF

おそらくwordlistfileの文字エンコーディングを探しています。

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

あるいは、行単位で作業している場合は、

line.encode('utf-8')
221
cwallenpoole

encoding formatutf-8のように定義する必要があります。この簡単な方法を試してください、

この例では、SHA256アルゴリズムを使用して乱数を生成します。

>>> import hashlib
>>> hashlib.sha256(str(random.getrandbits(256)).encode('utf-8')).hexdigest()
'cd183a211ed2434eac4f31b317c573c50e6c24e3a28b82ddcb0bf8bedf387a9f'
96
Jay Patel

パスワードを保存するには(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()
16

エラーはすでにあなたがしなければならないことを言っています。 MD5はバイトで動作するので、Unicode文字列をbytesにエンコードする必要があります。 line.encode('utf-8')で。

13
Cat Plus Plus

最初に that answerを見てください。

これで、エラーメッセージが明確になりました。Python文字列(Python <3でunicodeであったもの)ではなく、バイトのみを使用できるため、エンコードする必要があります。好みのエンコーディングの文字列:utf-32utf-16utf-8、または制限された8ビットエンコーディングのいずれか(コードページと呼ばれるものもあります)。

ワードリストファイルのバイトは、ファイルから読み取るときにPython 3によって自動的にUnicodeにデコードされます。あなたがすることをお勧めします:

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

そのため、md5アルゴリズムにプッシュされたエンコードデータは、基になるファイルとまったく同じようにエンコードされます。

10
tzot

ファイルをバイナリモードで開くことができます。

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
6
jfs
import hashlib
string_to_hash = '123'
hash_object = hashlib.sha256(str(string_to_hash).encode('utf-8'))
print('Hash', hash_object.hexdigest())
2
Sabyasachi

この行をエンコードして修正しました。

m.update(line.encode('utf-8'))
1
Mike Cash