[python] TypeError를 수정하는 방법 : 해시하기 전에 유니 코드 개체를 인코딩해야합니까?

이 오류가 있습니다.

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

파이썬 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()



답변

에서 문자 인코딩을 찾고있을 것입니다 wordlistfile.

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

또는 라인 단위로 작업하는 경우 :

line.encode('utf-8')


답변

다음 encoding format과 같이 정의해야합니다 utf-8.

이 예제는 SHA256 알고리즘을 사용하여 난수를 생성합니다.

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


답변

비밀번호를 저장하려면 (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()


답변

오류는 이미 수행해야 할 작업을 나타냅니다. MD5는 바이트에서 작동하므로 유니 코드 문자열을로 인코딩해야합니다 ( bytes예 : with) line.encode('utf-8').


답변

답변을 먼저 살펴보십시오 .

이제 오류 메시지는 분명하다 : 당신은 단지 (무엇을 사용했는지 바이트가 아닌 파이썬 문자열을 사용할 수 있습니다 unicode당신은 귀하의 기본 인코딩으로 문자열을 인코딩, 파이썬 <3 일) : utf-32, utf-16, utf-8또는 제한의 하나라도 8 비트 인코딩 (일부 코드 페이지 호출)

단어 목록 파일의 바이트는 파일에서 읽을 때 Python 3에서 자동으로 유니 코드로 디코딩됩니다. 나는 당신이 할 것을 제안합니다 :

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

따라서 md5 알고리즘으로 푸시 된 인코딩 된 데이터는 기본 파일과 정확하게 인코딩됩니다.


답변

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


답변

이진 모드에서 파일을 열 수 있습니다.

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