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

मैंने पाया कि 'आरबी' के साथ एक फाइल खोलने से मेरे मामले में मदद मिली।
dlamblin

जवाबों:


299

यह शायद एक चरित्र एन्कोडिंग से ढूंढ रहा है wordlistfile

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

या, यदि आप लाइन-बाय-लाइन आधार पर काम कर रहे हैं:

line.encode('utf-8')

3
open(wordlist,"r",encoding='utf-8')विशिष्ट एन्कोडिंग के साथ खुले का उपयोग क्यों करें, एन्कोडिंग को डिकोड कोडेक निर्दिष्ट किया गया है, इस विकल्प के बिना, यह प्लेटफ़ॉर्म-निर्भर एन्कोडिंग का उपयोग करता है।
टंकी वू

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 () यह एक निश्चित ज्ञात मान होना चाहिए लेकिन यह केवल सर्वर के लिए गुप्त हो सकता है। कृपया मुझे सुधारें या इसे अपने कोड में रूपांतरित करें।
यश

1
मैं मानता हूं कि @ यश आपके पास हर हैश के लिए या तो एक ही नमक है, जो आपके पास है (सबसे अच्छा नहीं), या यदि आप प्रत्येक हैश के लिए एक यादृच्छिक नमक उत्पन्न करते हैं, तो आपको इसे हैश के साथ बाद में तुलना करने के लिए फिर से उपयोग करने के लिए स्टोर करना होगा
कार्सन इवांस

15

त्रुटि पहले से ही कहती है कि आपको क्या करना है। MD5 बाइट्स पर काम करता है, इसलिए आपको यूनिकोड स्ट्रिंग को एनकोड करना होगा bytes, जैसे कि line.encode('utf-8')


11

कृपया पहले उस उत्तर पर एक नज़र डालें ।

अब, त्रुटि संदेश स्पष्ट है: आप केवल बाइट्स, नहीं अजगर तार (क्या हुआ करते थे उपयोग कर सकते हैं unicodeअपनी प्राथमिकता की इनकोडिंग के साथ तार एन्कोड करने के लिए, पायथन <3 में) ताकि आप हैं: utf-32, utf-16, utf-8या प्रतिबंधित की भी एक 8- बिट एनकोडिंग (जिसे कुछ कोडप्स कह सकते हैं)।

जैसे ही आप फ़ाइल से पढ़ते हैं, आपकी वर्डलिस्ट फ़ाइल में बाइट्स स्वचालित रूप से यूनिकोड को पायथन 3 द्वारा डिकोड किया जा रहा है। मैं आपको सुझाव देता हूं:

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

ताकि एन्कोडेड डेटा को md5 एल्गोरिथ्म में धकेल दिया जाए, बिलकुल अंतर्निहित फ़ाइल की तरह एन्कोडेड हैं।



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

अगर यह सिंगल लाइन स्ट्रिंग है। इसे बी या बी के साथ लपेटें जैसे:

variable = b"This is a variable"

या

variable2 = B"This is also a variable"

-3

यह प्रोग्राम उपरोक्त एमडी 5 क्रैकर का बग मुक्त और उन्नत संस्करण है जो फ़ाइल को हैशेड पासवर्ड की सूची में पढ़ता है और इसे अंग्रेजी शब्दकोश शब्द सूची से हैशेड शब्द के खिलाफ जांचता है। आशा है कि यह मददगार है।

मैंने निम्नलिखित लिंक 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()
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.