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


295

이 오류가 있습니다.

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

'rb'로 파일을 여는 것이 내 사건에 도움이된다는 것을 알았습니다.
dlamblin

답변:


299

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

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

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

line.encode('utf-8')

3
open(wordlist,"r",encoding='utf-8')특정 인코딩으로 open을 사용하는 경우 인코딩이 디코딩 코덱으로 지정되며이 옵션없이 플랫폼 종속 인코딩을 사용합니다.
Tanky Woo

129

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

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

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

18

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

1
이 줄은 암호를 사용할 수 없게합니다. password_salt = os.urandom (32) .hex () 알려진 고정 값이어야하지만 서버에 대해서만 비밀 일 수 있습니다. 나를 수정하거나 코드에 맞게 조정하십시오.
Yash

1
@Yash에 동의합니다. 모든 해시 (최고가 아님)에 사용하는 단일 솔트가 있거나 각 해시에 임의의 솔트를 생성하는 경우 나중에 비교를 위해 다시 사용할 수 있도록 해시와 함께 저장해야합니다.
Carson Evans

15

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


11

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

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

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

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

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


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

6

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

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

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

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

0

단일 행 문자열 인 경우 b 또는 B로 래핑하십시오. 예 :

variable = b"This is a variable"

또는

variable2 = B"This is also a variable"

-3

이 프로그램은 해시 된 비밀번호 목록이 포함 된 파일을 읽고 영어 사전 단어 목록에서 해시 된 단어와 비교하여 검사하는 위의 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()
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.