IT story

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

hot-time 2020. 4. 7. 08:32
반응형

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

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

이 줄을 인코딩하면 문제가 해결되었습니다.

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

이 프로그램은 해시 된 비밀번호 목록이 포함 된 파일을 읽고 영어 사전 단어 목록에서 해시 된 단어와 비교하여 검사하는 위의 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()

참고 URL : https://stackoverflow.com/questions/7585307/how-to-correct-typeerror-unicode-objects-must-be-encoded-before-hashing

반응형