python TypeError को कैसे ठीक करें: यूनिकोड-ऑब्जेक्ट्स को हैशिंग से पहले एन्कोड किया जाना चाहिए?




python-3.x unicode (5)

पासवर्ड स्टोर करने के लिए (पीवाई 3):

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

मुझे यह त्रुटि है:

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:
        m = hashlib.md5()  #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)
        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()

आप फाइल को बाइनरी मोड में खोल सकते हैं:

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

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

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

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

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

ताकि एमडी 5 एल्गोरिदम को धक्का दिया गया एन्कोडेड डेटा अंतर्निहित फ़ाइल की तरह एन्कोड किया गया हो।


यह शायद wordlistfile से एक वर्ण एन्कोडिंग की तलाश में है।

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

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

line.encode('utf-8')

आपको utf-8 जैसे encoding format को परिभाषित करना होगा, इस आसान तरीके से प्रयास करें,

यह उदाहरण SHA256 एल्गोरिदम का उपयोग करके एक यादृच्छिक संख्या उत्पन्न करता है:

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




hashlib