Использование солевого хэша для преобразования паролей в хэши

у меня есть словарь паролей. и хеш-ключи из 6 паролей и сольный ключ.

вот мой код. я прочитал все заданные пароли и ключ соли.

для первых трех паролей я читаю каждый элемент словаря и преобразовываю его в хеш, используя sha1, sha256 и md5 соответственно, и сравниваю с заданными хэшами паролей.

теперь для 4-го 5-го и 6-го пароля. есть солевой ключ. некоторые инструкции: -

Кроме того, три хэша были созданы путем объединения значения соли с паролем. Ваш код также должен иметь возможность восстанавливать пароли из этих трех соленых хэшей.

  1. Значение соли хранится в файле в виде последовательности пар шестнадцатеричных символов.
  2. ПРИМЕЧАНИЕ. Каждая пара шестнадцатеричных символов содержит один байт соли, который вы должны использовать. Например, шестнадцатеричная пара a9 должна быть преобразована в байтовое значение 169 (десятичное), чтобы использоваться в качестве солт-байта.

Кроме того,

""Не преобразовывайте шестнадцатеричные символы из файла соли в десятичные символы. Я сказал, что вы должны преобразовать каждую пару шестнадцатеричных символов в одно байтовое значение. Я просто использовал пример, в котором я показал вам это значение байта с основанием 10, то есть десятичное значение. После того, как вы выполните это преобразование, у вас будет последовательность значений байтов, которые составляют ваше значение соли. Затем вы объединяете эти значения со значениями байтов выбранного пароля. При использовании Java вы можете вызвать метод update() вашего объекта дайджеста дважды — один раз для каждой последовательности байтовых значений. При использовании Python используйте метод update() хеш-объекта, созданного с помощью hashlib.""

я не понимаю, как и что я должен сочетать с солью хэш. как найти пароли, эквивалентные последним трем хэшам паролей (spw1, spw2, spw3). я не ищу решение, но некоторое понимание использования будет полезно. я читаю документацию по библиотеке hashlib для этого.

import time
import hashlib
import sys

pw1 = open('pw1.hex','r').read()[:-1] # sha1
pw2 = open('pw2.hex','r').read()[:-1] # sha256
pw3 = open('pw3.hex','r').read()[:-1] # md5
salt = open('salt.hex','r').read()[:-1]
spw1 = open('spw1.hex','r').read()[:-1]
spw2 = open('spw2.hex','r').read()[:-1]
spw3 = open('spw3.hex','r').read()[:-1]

print("Password 1 :", pw1)
print("Password 2 :", pw2)
print("Password 3 :", pw3)
print("Salt :", salt)
print("Salt Password 1 :", spw1)
print("Salt Password 2 :", spw2)
print("Salt Password 3 :", spw3)

salts = []
for i in range(0, len(salt), 2):
    salts.append(pw1 + str(int(salt[i] + salt[i+1], 16)))

# start =import time
import hashlib
import sys

pw1 = open('pw1.hex','r').read()[:-1]
pw2 = open('pw2.hex','r').read()[:-1]
pw3 = open('pw3.hex','r').read()[:-1] # md5
salt = open('salt.hex','r').read()[:-1]
spw1 = open('spw1.hex','r').read()[:-1]
spw2 = open('spw2.hex','r').read()[:-1]
spw3 = open('spw3.hex','r').read()[:-1]

print("Password 1 :", pw1)
print("Password 2 :", pw2)
print("Password 3 :", pw3)
print("Salt :", salt)
print("Salt Password 1 :", spw1)
print("Salt Password 2 :", spw2)
print("Salt Password 3 :", spw3)

salts = []
for i in range(0, len(salt), 2):
    salts.append(pw1 + str(int(salt[i] + salt[i+1], 16)))    

start = time.time()
filename = open('dic-0294.txt','r')
guess=" "
for line in filename:
    m = hashlib.sha1()
    m.update(line[:-1].encode('utf-8'))
    guess = m.hexdigest()
    if guess == pw1:
        print ("total runtime for password 1 was --", time.time() - start, " seconds and the answer was:", line[:-1])
        break
#close dictionary file
filename.close()

start = time.time()
filename = open('dic-0294.txt','r')
guess=" "
for line in filename:
    m = hashlib.sha256()
    m.update(line[:-1].encode('utf-8'))
    guess = m.hexdigest()
    if guess == pw2:
        print ("total runtime for password 2 was --", time.time() - start, " seconds and the answer was:", line[:-1])
        break
#close dictionary file
filename.close()

start = time.time()
filename = open('dic-0294.txt','r')
guess=" "
for line in filename:
    m = hashlib.md5()
    m.update(line[:-1].encode('utf-8'))
    guess = m.hexdigest()
    if guess == pw3:
        print ("total runtime for password 3 was --", time.time() - start, " seconds and the answer was:", line[:-1])
        break
#close dictionary file
filename.close()

ВЫХОД:-

Password 1 : 44afbc26b785d9c5cfce73aa06dd0711f2e290d5
Password 2 : d2e7560d96b0f6ceac88ac8d94f0fdc39d36252d2432ecb1ab510450a93b3c2c
Password 3 : 95d19ab48d18d4232b87bb086319998c
Salt : d41d8cd98f00b204e9800998ecf8427e
Salt Password 1 : 955597a308bd22402bf841f19d393526a15396cf49e9477af9f21f45fcfe13c8
Salt Password 2 : 00b961e20655b8cb16fb7aff3d3a28a3
Salt Password 3 : bbdefeaebc9ac07b9ad47fd8f9e1b7bf3170bcfc
total runtime for password 1 was -- 2.097641944885254  seconds and the answer was: computationally-intensive
total runtime for password 2 was -- 0.6852984428405762  seconds and the answer was: BIzarre
total runtime for password 3 was -- 1.529630184173584  seconds and the answer was: instructed

person 5D_cOOKIE    schedule 28.04.2020    source источник


Ответы (1)


Я знаю, что этому почти год, и меня не волнует, получу ли я признание за свой ответ, но, увидев, что я наткнулся на это в своем собственном поиске этого решения, я полагаю, что кто-то другой тоже может его найти. Это задание курса по компьютерной безопасности, поэтому я не собираюсь просто давать ответ, но я прокомментирую пару моментов, чтобы кто-то еще мог получить толчок в правильном направлении.

Во-первых, в приведенном выше коде похоже, что хэш из файла «солится», чтобы попытаться сопоставить. Это не то, что должно быть сделано. Шесть хешированных паролей, только три соленых - файлы spw*.hex. Эти хэши являются результатом посолки и хэширования слова из словаря, а не хэша в файле pw*.hex.

Основная операция взломщика словарей должна заключаться в том, чтобы взять слово из списка слов, посолить его и хешировать, а затем сравнить с хэшем в файле spw*.hex, который у вас уже есть. Хэши являются односторонними, поэтому вы на самом деле не взламываете известный вам хэш, а пытаетесь перебирать значения, пока не сгенерируете соответствующий хеш.

Посмотрите и посмотрите, что доступно в hashlib, чтобы помочь с проблемным шагом, который представляет собой преобразование из шестнадцатеричного в байты для строки соли. Функции есть, так что не переусердствуйте с процессом. Затем сделайте то, что говорят инструкции - преобразуйте шестнадцатеричную строку в байты и добавьте к байтовому значению строки, которую вы солите (слово словаря). Другими словами, конвертируйте оба в байты, конкатенируйте, а затем хешируйте. Очевидно, необходимо выяснить правильную хэш-функцию (в этом задании используются только три) и порядок солей, но это должно быть относительно легко выяснить или приспособить.

person jb11    schedule 13.04.2021