Работа мечты в один клик 💼

💭Мечтаешь работать в Сбере, но не хочешь проходить десять кругов HR-собеседований? Теперь это проще, чем когда-либо!
💡AI-интервью за 15 минут – и ты уже на шаг ближе к своей новой работе.
Как получить оффер?
📌 Зарегистрируйся
📌 Пройди AI-интервью
📌 Получи обратную связь сразу же!
HR больше не тянут время – рекрутеры свяжутся с тобой в течение двух дней! 🚀
Реклама. ПАО СБЕРБАНК, ИНН 7707083893. Erid 2VtzquscAwp
В этой статье мы разберём код программы на Python 3.6 с использованием BruteForce для взлома криптографической хеш-функции.
Всё, что нам необходимо знать, чтобы сделать перебор по словарю, – это алгоритм хеш-функции, с помощью которого зашифрована информация (в нашем случае – простой текст). В программе будем использовать три алгоритма из библиотеки hashlib
: md5
, sha256
, sha512
. Вы можете усовершенствовать код, добавив в него другие алгоритмы, представленные в hashlib
. Документацию по библиотеке можете найти здесь, здесь и здесь.
Работа с командной строкой
Чтобы вызвать программу, перейдём в папку, где лежит исходник (main.py), словарь (будем использовать rockyou.txt, скачать его можно здесь) и файл с хеш-функцией (назовём его hash.txt). Аргументы командной строки имеют следующий вид:
- Нулевой аргумент (необязателен)
- Название алгоритма шифрования
- Имя файла с хеш-функцией (hash.txt)
- Имя словаря (rockyou.txt)
К примеру, вызов программы с использованием алгоритма md5
будет выглядеть так:
./main.py md5 hash.txt rockyou.txt
Разбираем код для взлома хеш-функции
Код небольшой, поэтому я помещу его здесь, а дальше буду разбирать по строкам.
# Examples:
# md5: fc5e038d38a57032085441e7fe7010b0 = helloworld
# sha256: 3fc9b689459d738f8c88a3a48aa9e33542016b7a4052e001aaa536fca74813cb = something
# sha512: 9b71d224bd62f3785d96d46ad3ea3d73319bfbc2890caadae2dff72519673ca72323c3d99ba5c11d7c7acc6e14b8c5da0c4663475c2e5c3adef46f73bcdec043 = hello
from sys import argv
from hashlib import sha256, sha512, md5
# chmod +x main.py
# ./main.py md5 hash.txt rockyou.txt
line = "----------------------------------"
try:
hashAlgr,fileHash,fileDict = argv[1],argv[2],argv[3]
except IndexError:
print("Error: Arguments!")
raise SystemExit
with open(fileHash) as file:
hashFunc = file.read()
hashFunc = hashFunc.replace('\n','')
def generator(string):
for word in string:
passwd = word.replace('\n','')
if encrypt(passwd) == hashFunc:
yield line +"\n[True]: "+passwd
return
else:
yield "[False]: "+passwd
def encrypt(string):
passwd = string.encode()
if hashAlgr == "md5":
signature = md5(passwd).hexdigest()
elif hashAlgr == "sha256":
signature = sha256(passwd).hexdigest()
elif hashAlgr == "sha512":
signature = sha512(passwd).hexdigest()
else: raise SystemExit
return signature
print(line)
with open(fileDict, errors = "ignore") as dictionary:
for password in generator(dictionary):
print(password)
print(line)
Первым делом из библиотеки sys
импортируем argv
, чтобы работать с программой из командной строки. Затем из библиотеки hashlib
импортируем алгоритмы, которые будем использовать – sha256
, sha512
, md5
(строки 6 и 7).
В строке 12 добавляем линию, которая будет отображаться при выводе найденной фразы (сделано для красоты).
В строках 14-18 инициализируем аргументы и проверяем их кол-во. Если при вводе в командную строку не обнаруживается какой-либо аргумент, выводится ошибка, а программа прекращает работу.
Если не вывелось никакой ошибки, то на строках 20-22 открываем файл с хеш-функцией (hash.txt) и удаляем оттуда перенос строки – \n
.
Далее идёт функция generator: она осуществляет перебор ключей по словарю. В строке 28 убираем у слова перенос строки \n
и записываем в переменную passwd
. Затем сравниваем зашифрованную с помощью функции encrypt
строку passwd
с хеш-функцией, записанной в hash.txt
. Если значения совпадают, возвращаем из функции generator
строку [True]
и найденный ключ. Если нет, то возвращаем [False]
и текущий ключ.
Разберём функцию encrypt
. В строке 34 преобразуем переданный passwd
в юникод. Чтобы понять, для чего это делается, смотрите документацию к библиотеке hashlib
, которую я прикрепил в начале статьи.
В строках 35, 37 и 39 сравниваем аргумент hashAlgr
, полученный из командной строки с имеющимися алгоритмами. Если не находится совпадение, программа завершается. Если аргумент соответствует одному из наших алгоритмов, то шифруем passwd
с помощью алгоритма, преобразовываем в шестнадцатиричную систему и возвращаем его.
Рассмотрим заключительный фрагмент кода. В строке 45 мы открываем словарь. Также при открытии игнорируем ошибки. Далее просто перебираем пароли через функцию generator.
Заключение
Логика программы довольно проста. Если вы хорошо разбираетесь в программировании, можете с лёгкостью усовершенствовать её, добавив несколько алгоритмов шифрования, например, blake2b или алгоритм, использующийся в OpenSSL. Также возможно создание посимвольного перебора для фиксированной длины, однако такой способ будет работать гораздо дольше, чем перебор по словарю, но зато шанс взломать криптографическую хеш-функцию будет гораздо выше.
Комментарии