Хэширование файла csv в алгоритме python usig sha256
Я хочу сделать какой-нибудь хак для 4numberic блокировки в CSV-файле и выяснить код блокировки.
Я видел название здесь, но это был не тот же вопрос.
В этом проекте я должен импортировать только "hashlib" и "CSV".
Программа должна быть просто в задании def.
import hashlib
import csv
def hash_password_hack(input_file_name, output_file_name):
# all the task must be here
CSV-файл содержит имя и код hashlib-sha256, например:
jack,99b057c8e3461b97f8d6c461338cf664bc84706b9cc2812daaebf210ea1b9974
huge,85432a9890aa5071733459b423ab2aff9f085f56ddfdb26c8fae0c2a04dce84c
Код находится между 0000 и 9999. Желаемым выводом является код.
jack,5104
huge,9770
2 ответа
Поскольку у вас есть только возможные комбинации в диапазоне 0000
в 9999
Можно создать хэши sha256 для всех возможных комбинаций. Они могут храниться в словаре в том же формате, который присутствует в заданном вами CSV-файле, а именно в шестнадцатеричном дайджесте. Это сделано с помощью range()
предоставить все номера, а затем .format()
преобразовать число в строку с ведущими нулями. Затем он может быть закодирован в байты и передан в хеш-библиотеку.
После того как словарь был создан, можно просто искать каждый хеш прямо в словаре, чтобы получить соответствующую комбинацию. Библиотека CSV в Python может использоваться как для чтения, так и для записи файлов CSV. При чтении это автоматически разбивает строку и возвращает каждую запись в виде списка. Для написания сделано обратное, а именно, вы даете ему список элементов, и он запишет их с разделителем-запятой, автоматически добавленным между ними. Вы также должны указать newline=''
для ваших файлов.
import hashlib
import csv
def hash_password_hack(input_file_name, output_file_name):
# Generate all possible combinations
hash_lookup = {}
for combination_int in range(10000):
combination_str = '{:04}'.format(combination_int)
m = hashlib.sha256(combination_str.encode('ascii'))
hash_lookup[m.hexdigest()] = combination_str
with open(input_file_name, newline='') as f_input, open(output_file_name, 'w', newline='') as f_output:
csv_input = csv.reader(f_input)
csv_output = csv.writer(f_output)
for user, hash in csv_input:
csv_output.writerow([user, hash_lookup[hash]])
hash_password_hack('input.csv', 'output.csv')
Известно, что алгоритм хеширования sha256 необратим. Это означает, что не существует прямого способа найти исходную строку из ее хеша.
Но здесь энтропия возможных ключей очень ограничена: всего 10000 возможных значений. В этом случае лучшим способом является атака методом грубой силы: сравните каждый из хэшей с одним из 10000 возможных значений. Небольшой оптимизацией может быть предварительное вычисление 10000 хешей и использование только сравнения строк с этого момента.
Псевдо-код:
build a list for hashes of byte string from `b'0000'` to `b'9999'`
for each line of the input csv file
search index of second field in list of hashes
raise an error of print a warning message if not found
use it to write into output csv
Что помнить из этого:
Каким бы ни было качество алгоритма хеширования, когда энтропия плохая, пароль - неделя: никогда не используйте значения, которые могут быть использованы в простых атаках по словарю.