Path Secure
3.53K subscribers
117 photos
6 videos
4 files
224 links
Авторский блог о развитии.

Прайваси, инфосек, криптография, децентрализация, администрирование, пентесты, горизонтальность.

YT: https://www.youtube.com/@pathsecure

связь: @curiv

"Dance like nobody's watching. Encrypt like everyone is" ©
Download Telegram
Некоторое время назад взялся за старую задачку из беклога: нужно было объединить словари с паролями.

Сложность в том, что размер словарей был большим. 200 гигов и 56 гигов.

С большой вероятностью многие строчки будут дублироваться, а значит нужно убирать дубликаты. Я сразу понял, что решать такую задачу влоб (используя стандартные GNU утилиты sort и uniq нельзя). В связи с этим я пообщался с дата-сатанистами и объяснил свою задачу. Мне посоветовали воспользоваться duckdb.

Это форк sqlite на rust и это колоночная бд с кучей оптимизаций. Я решил попробовать. Установка очень простая, кажется, я выкачал бинарник на сервер и всё.

Кстати, о сервере. Это было достаточно смешно и интересно. У меня было где-то 3-4 итерации. Сперва я закупил виртуалку с 16 ядер и 32 гигов оперативной памяти. Я сразу же упёрся в производительность процессора, а потом в количество оперативной памяти, потому то duckdb буферизирует данные в оперативной памяти для обработки. Далее я увеличил размер оперативной памяти примерно до 60 и процессор до 32 ядер. На второй итерации я упёрся в производительность диска, потому что всё, что не помещается в оперативную память пишется на диск. Спустя несколько итераций я дошел до мегавиртуалки с 500 гигами оперативы и 64 ядрами процессораа, а также супер быстрыми дисками со скоростью 1000 мб/сек. 300 гигов рамы мне не хватало для задачи удаления нечитаемых символов.

В целом опыт достаточно забавный. Суммарно на всё ушло две субботы. Чуть больше познакомился с облачными вычислениями. По итогу имеется большой словарь, представляющий собой компиляцию из других словарей. Суммарный объем выше даже меньше, чем я предполагал, примерно 180 гигов. Всё веселье вышло примерно в 5к рублей. В целом совсем не много для исследовательского проекта в рамках бизнес задачи. Думаю, что всё можно было сделать суммарно часа за 2, если сразу взять большую виртуалку и загрузить словари в облачное хранилище, а также копировать и вставлять готовые команды.

А как вы решаете такие задачи? Поделитесь в комментариях!

Ниже полезные команды, которые мне понадобились для выполнения этой задачи:

Расширяем лимит для записи на диск, иначе загрузка может внезапно обрубиться:
PRAGMA max_temp_directory_size='200GiB'

Задаем число потоков для одновременной обработки:
PRAGMA threads = 32

Указывает максимальный объём оперативной памяти для использования:
PRAGMA memory_limit = '244GB';

Создание таблицы из файла без заголовка:
CREATE TABLE "merged_passwords" as select * from read_csv_auto('rockyou2021.txt', header=false, columns={'password':'TEXT'}, ignore_errors=true);

Чтение файла и загрузка его в таблицу:
insert into merged_passwords SELECT DISTINCT * from read_csv_auto('bigfile.txt', header=false, ignore_errors=True);

Также можно вычищать пустые сиволы из строк по регулярке:
update merged_passwords set password = regexp_replace(password, '\00', ' ','g')

Удалить строки короче 8 символов
DELETE FROM merged WHERE LENGTH(password) < 8;

Выгрузка базы в текстовый файл:
COPY merged_passwords to 'merged.txt' (HEADER FALSE);

#rnd #wordlists #duckdb
1🔥29👍72🤔1🤝1