কীভাবে টাইপ এরির সংশোধন করবেন: হ্যাশিংয়ের আগে ইউনিকোড-অবজেক্টগুলি এনকোড করাতে হবে?


293

আমার এই ত্রুটি রয়েছে:

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

যখন আমি পাইথন ৩.২.২ এ এই কোডটি কার্যকর করার চেষ্টা করি :

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
এই লাইনটি পাসওয়ার্ডটি ব্যবহার করা অসম্ভব করে তোলে। পাসওয়ার্ড_সাল্ট = os.urandom (32) .হেক্স () এটি একটি নির্দিষ্ট জ্ঞাত মান হওয়া উচিত তবে এটি কেবল সার্ভারের জন্যই গোপন হতে পারে। দয়া করে আমাকে সংশোধন করুন বা এটি আপনার কোডের সাথে মানিয়ে নিন।
যশ

1
আমি @ ইশের সাথে একমত, আপনার হয় প্রতিটি হ্যাশের জন্য আপনি ব্যবহার করেন একক লবণ (সেরা নয়), বা যদি আপনি প্রতিটি হ্যাশের জন্য একটি এলোমেলো লবণ উত্পন্ন করেন তবে তুলনার জন্য আপনাকে আবার এটি ব্যবহার করতে হ্যাশ দিয়ে সংরক্ষণ করতে হবে
কারসন ইভান্স

14

ত্রুটিটি ইতিমধ্যে আপনাকে যা করতে হবে তা বলেছে। MD5 বাইট করে পরিচালিত, তাই আপনি এনকোড করেন ইউনিকোড স্ট্রিং আছে bytes, সঙ্গে যেমন line.encode('utf-8')


11

দয়া করে প্রথমে একটি কটাক্ষপাত যে উত্তর।

এখন, ত্রুটির বার্তা স্পষ্ট হল: আপনি শুধুমাত্র বাইট, না পাইথন স্ট্রিং (কি ব্যবহার করা হয় ব্যবহার করতে পারেন unicodeআপনার পছন্দের এনকোডিং এর সাথে স্ট্রিং সঙ্কেতাক্ষরে লিখা, পাইথন <3 মধ্যে) যাতে আপনি আছে: utf-32, utf-16, utf-8অথবা সীমিত এমনকি এক 8- বিট এনকোডিংস (কিছু কোডড যা কল করতে পারে)।

আপনার ফাইললিস্ট ফাইলের বাইটগুলি পাইথন 3 দ্বারা স্বয়ংক্রিয়ভাবে ইউনিকোডে ডিকোড করা হচ্ছে ফাইলটি পড়ার সাথে সাথে। আমি আপনাকে পরামর্শ দিই:

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

যাতে এমডি 5 অ্যালগরিদমের দিকে ধাকানো এনকোডড ডেটা অন্তর্নিহিত ফাইলের মতো হ'ল এনকোড হয়।



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

এই প্রোগ্রামটি হ'ল উপরের 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.