Хэширование файла 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

Что помнить из этого:

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

Другие вопросы по тегам