Расшифровка базы данных KeePass: пошаговое руководство. Безопасное хранение паролей в KeePass Professional Расшифровка базы данных KeePass

Расшифровка базы данных KeePass: пошаговое руководство. Безопасное хранение паролей в KeePass Professional Расшифровка базы данных KeePass

Возможно ли как-то взломать KeePass и слить пароли?

Если кто не знает что такое KeePass, то вкратце — это программа менеджер паролей, которая позволяет с помощью запоминания одного мастер пароля хранить . Подробно о менеджерах паролей вы можете прочитать на нашем.

До недавнего времени взлом KeePass был невозможен, но на днях некий Denis Andzakovic выложил в сеть бесплатную утилиту KeeFarce, которая позволяет злоумышленнику украсть пароли популярного менеджера паролей.

Скачать бесплатно KeeFarce вы можете по этой прямой ссылке.

Взлом KeePass с пощью KeeFarce

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

Использовать KeeFarce очень просто. Просто скопируйте в папку KeePass файлы:

  • BootstrapDLL.dll
  • KeeFarceDLL.dll
  • Microsoft.Diagnostic.Runtime.dll

И запустите исполняемый файл KeeFarce.exe


После запуска программа инжектирует в запущенный процесс KeePass. Затем утилита экспортирует все пароли в файл csv в папку appdata.

Как защититься от взлома KeePass

В первую очередь проверить свой компьютер на трояны (), так как данная схема может быть реализована в том случае, если у злоумышленника есть удалённый доступ к вашему компьютеру или есть физический доступ во время того, как вы оставив открытым менеджер паролей ненадолго отошли от компьютера.

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

Что по поводу других менеджеров паролей?

Данная уязвимость (не именно эта утилита) может быть использована и для кражи паролей из других программ для хранения паролей. Я думаю скоро будет не малое количество подобных инструментов, как отдельных так и встроенных в различные вредоносные программы.

Надо ли отказываться от использования менеджеров паролей?

Решать вам. Лично я считаю, что при правильном использовании KeePass и надлежащей компьютерной гигиене проблем быть не должно.

Пользуясь интернетом и компьютером у нас появляется все больше паролей. Это пароли и логины к почтовому ящику, к скайпу, к сайтам, на которых мы зарегистрировались (вконтакте, одноклассники и т.д.), а более продвинутые пользователи используют еще и , пароли к разным программам, пароли к FTP, ключи лицензий и этот список еще можно долго продолжать. Чем больше у нас появляется паролей (разумеется, еще и логинов к ним), тем очевиднее, что нужно какое-то надежное хранилище для них. Конечно, мы можем создать.txt документ и там все записывать и хранить. Может быть, что читая эти строки, Вы думаете: «Я как раз так и делаю, чем это плохо?». Может и не плохо, но это не удобно, к тому же есть более лучший способ хранения паролей. Уверен, он Вам понравится. Этот способ заключается в использовании менеджера паролей под названием KeePass . Какие его преимущества?

1) Все ваши пароли находятся в программе, которая надежно защищена от взлома паролем и при этом они зашифрованы AES алгоритмом (128-бит блочный шифр, используя 256-бит ключ). При входе в программу нужно ввести пароль, иначе доступа не получить. Рекомендуется, чтобы пароль состоял из не менее 20 символов, если взломщик захочет подобрать такой пароль, ему будут нужны десятилетия; вряд ли кому-то будет интересно подбирать такой длинный пароль;
2) Удобный интерфейс программы, Вы можете объединять группы в пароли (например, группа «Социальные сети», группа «Почты»);
3) Функция автонабора — программа умеет автоматически ввести логин и пароль;
4) Портативная версия KeePass позволяет удобно носить с собой все Ваши пароли на флешке;
5) В KeePass находится генератор паролей, так что теперь не нужно самому придумывать их. Генератор паролей также содержит дополнительные настройки, позволяющие задать какие символы использовать или не использовать и сколько раз они должны встречаться в одном пароле.

Это основные преимущества. Теперь рассмотрим, как работать с программой KeePass. Начнем с установки и русификации KeePass. (Программу KeePass скачайте в конце этой статьи) . Установка интуитивно понятная, поэтому останавливаться на ней не будем. После установки программу нужно русифицировать. Для этого в архиве, который Вы скачали, найдите файл «Russian» и скопируйте его в папку с установленной программой. Обычно путь такой: «C /Programm Files/KeePass Password Safe». Но может быть и другой путь, в зависимости от ваших настроек.

Затем запускаем программу. При первом ее запуске будет такое окно:

Нас спрашивают включить ли автоматическое обновление. Конечно, это нужно сделать, поэтому выбираем первый вариант: «Enable (recommend)». Увидим главное окно программы:

KeePass еще на английском и нужно завершить русификацию. Для ее завершения переходим: View/Change Language. Скриншот:

Здесь выбираем русский язык

Вот таким образом проходит русификация KeePass.

А теперь приступаем к созданию нашей базы паролей. Для этого жмем: Файл/Новый, или просто Ctrl+N.

Придумываем имя для нашей базы и кликаем «Сохранить». Обратите внимание, куда Вы сохраняете базу паролей, так как отныне здесь будут храниться все Ваши пароли. Например, если захотите перенести базу паролей на другой компьютер, этот файл Вам нужно будет скопировать. Могут быть и какие-то другие ситуации, где Вам будет нужен файл базы паролей. Поэтому храните его там, где сможете без труда его найти. Отнеситесь к этому важному моменту крайне внимательно.

Здесь нам нужно придумать основной пароль, который будет использоваться при входе в программу. Он должен быть не менее 20 символов, как уже упоминалось вначале статьи. Пароль из менее 20 символов не стоит использовать; не экономьте на количестве символов в пароле. Теперь это будет единственный пароль, который Вам нужно помнить, другие будут храниться в программе. Также поставьте флажок возле «Ключевой файл», без него, даже зная пароль, Вы не сможете зайти в программу. Этот шаг усложнит взлом Вашей базы паролей, если кто-то попытается это сделать. Вот такая защита используется в KeePass. Нажимаем «Новый».

Здесь задаем имя файла ключа и сохраняем его. Запомните куда Вы его сохраняете. Файл базы паролей и ключевой файл — это два основных файла, которые обязательны для входа в базу паролей. Вы не должны их терять, иначе вернуть доступ к сохраненным в KeePass паролям не получится.

В этом окне нужно сгенерировать случайные числа. Хотя звучит сложно, но делается очень просто. Двигайте курсором мышки по серой области и таким образом сгенерируются случайные числа. «До каких пор водить мышкой по серой области?» - спросите Вы. Обратите внимание, что внизу есть пустая область (на неё указывает вторая стрелочка). Двигайте мышкой в случайном порядке до тех пор, пока эта область не заполнится.

Что должно получиться в результате? Смотрим скриншот:

Видим, что количество бит - 256, это значит, что мы все правильно сделали и теперь кликаем «ОК». Наш ключ готов!

Теперь и здесь тоже все готово. Жмем «ОК».

В окне «Создание новой базы паролей» кликаем «ОК».

Все готово и на скриншоте можем увидеть, как выглядит KeePass.

Как упоминалось вначале статьи, в этой программе пароли можно сортировать по группам. В ней, по-умолчанию, уже созданы группы для хранения паролей и тестовые записи паролей. Слева находятся группы, а справа пароли. Разумеется, тестовые записи нам не нужны. Удаляем их.

Также удаляем группы. Если те группы, которые уже есть, Вам подходят, можете их не удалять. Мы же удалим существующие группы и создадим другие, новые. Чтобы удалить группу нажимаем на ней правой кнопкой мыши и выбираем пункт «Удалить группу».

Итак, группы удалили, а теперь создаем новые. Для этого переходим Правка/Добавить группу

Вводим название группы. Пусть в этой группе мы будем хранить пароли к нашим почтовым ящикам. Вот группу паролей так и назовем - «Почты». Скриншот:

Как видим, у нас появилась созданная нами группа паролей с названием «Почты». Правильно подобранное название облегчает понимание того, к чему относятся пароли, которые там сохранены. Вывод: давайте понятные имена и Вы легче и быстрее найдете нужную запись.

Следующая задача — это сделать запись в группе. Как Вы уже догадались, в записи будет храниться логин и пароль к почте, а также еще кое-какие полезные вещи. О них поговорим чуть дальше. А сейчас давайте посмотрим, как добавить запись к группе. Для этого переходим «Правка/Добавить запись…»

У нас открылось окно «Добавление записи»

Заполняем форму, 1) придумываем название записи, 2) имя - это логин, 3) стираем пароль, который уже есть и вводим тот, что мы используем для почты, можно тоже задать ссылку на страницу, на которой нужно будет ввести логин и пароль и написать еще и комментарии. В комментариях можем указать ответ на контрольный вопрос или еще какие-то данные, которые мы указывали при регистрации, в общем, все, что нам нужно. Вот пример:

Вот как выглядит созданная запись.

Кстати, логин (в KeePass он называется Имя) можно скрыть звездочками, наподобие того, как скрыт пароль. Чтобы сделать это перейдите во вкладку Вид и выберите соответствующий пункт.

Давайте подведем итоги проделанной работы. Мы добавили все одну запись и этого вполне достаточно, чтобы понять, как проходит этот процесс. Теперь Вы аналогично перенесите все свои пароли в эту программу. Таким образом, Вы создадите свою базу и сможете удобно и быстро находить нужные Вам комбинации логинов и паролей.

Как теперь «вытащить» логин и пароль из записи? Нажимаем правой кнопкой мыши на записи. Смотрим скриншот:

Появилось меню. Внимательно его просмотрев, видно, что можно копировать имя, копировать пароль, изменить и удалить запись. Это самые основные функции. Но здесь есть еще одна очень полезная фишка, которая называется «Начать автонабор». Как ею пользоваться? Вначале ставим курсор в поле логина в форме на сайте, а затем переходим к записи и выбираем «Начать автонабор». Программа автоматически введет логин и пароль.

Еще одна полезная штука, которая есть в KeePass — генератор паролей. Что это такое и зачем он нужен, надеюсь всем понятно. Он находится во вкладке инструменты. Там все интуитивно понятно, думаю, что разобраться в нем будет несложно.

На этом можно завершать. Всего Вам наилучшего.

В одном из прошлых видео я уже рассказывал о программе для безопасного хранения паролей . Но, в результате проведения определенных экспериментов выяснилось, что хранить в ней пароли не так уж и безопасно, но это касается классической версии программы. По этому, в данном видео, рассмотрим профессиональную версию KeePass. Тем более что она так же бесплатна, как и классическая версия. Если вы впервые слышите о данной программе, то советую сначала посмотреть мой обзор на классическую версию, чтобы не возникали лишние вопросы.

И так, чем же мы будем заниматься в данном уроке:

Займемся взломом классической версии KeePass Password Safe через Key logger;

Импортируем базу из классической версии в профессиональную;

Рассмотрим основные отличия и нововведения;

И попытаемся взломать Key logger-ом профессиональную версию.

И первым делом зайдем на сайт разработчиков программы www.keepass.info \ download. Скачаем обе версии в портативном формате, так как я ношу базу с паролями на флешке, то и программа для их просмотра должна так же запускаться с флешки, без установки в операционную систему.

Я это уже сделал, а так же создал тестовую базу данных для классической версии. На данный момент, у меня в системе запущена программа шпион LanAgent. Данная программа относится к Key logger-ам, т.е. программам, которые записывают все действия пользователя на компьютере. Так что, теперь узнаем, насколько надежно данная программа защищает наши пароли!

Запускаем классическую версию и открываем в ней созданную базу, вводим пароль к базе и авторизуемся на сайте Rutracker.org.

Теперь посмотрим, что смог перехватить LanAgent, обновим логи и видим, что программа перехватила как мастер ключ, так и логин и пароль для сайта Rutracker. Даже если мы попытаемся вводить данные через буфер обмена, то программа так же перехватит содержимое буфера. С другой стороны пароль к базе бесполезен, если злоумышленнику не к чему её применять, т.е. база то находится на нашей флешке. Но в данной ситуации, программы могут в фоновом режиме копировать содержимое флешки или файлы к которым были обращения, а следовательно незаметно для нас, база может быть скопирована и все пароли вскрыты при помощи мастер ключа!

В общем, можно сделать следующий вывод, классическая версия подходит для того, чтобы не хранить пароли в явно открытом виде, но при использовании программ шпионов, она не поможет. А избавиться от данной бреши, нам поможет профессиональная версия!

1) Руссифицируем программу для более удобной работы (www . keepass . info \ Translations \ Russian \ 2.28 \ разархивируем в папку с программой \ View \ Change Language \ Russian )

2) Создадим новую базу (Файл \ Новый \ Указываем путь и имя \ Задаем основной пароль )

3) Перенесем данные со старой базы, чтобы не вбивать все вручную (Файл \ Импорт \ KeePass 1. x \ Указываем путь к старой базе \ ОК \ Вводим пароль к базе \ Новые идентификаторы )

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

1) Ввод основного пароля в защищенном режиме, что позволяет блокировать работу Key logger-а, при вводе основного пароля (Сервис \ Настройки \ Безопасность \ Ввод основного пароля в защищенном режиме )

2) Генератор паролей создает сразу 30 паролей, согласно выбранной сложности. Из которых можно выбрать, на ваш взгляд, наиболее сложный.

3) Языком автонабора проще пользоваться, нежели в классической версии. Про него я не рассказывал в обзоре классической версии, поэтому давайте рассмотрим, чем он может помочь!

По умолчанию, при автоматическом вводе срабатывает следующая последовательность команд. В активное поле вводится логин, TAB, пароль и ENTER. Эту последовательность можно увидеть, если открыть запись \ Автонабор \ Использовать следующую последовательность . И данный вариант подходит в большинстве случаев, как подошел к входу на rutracker.

Однако он не подойдет для входа в почту через сайт www.mail.ru . Так как у меня тестовый ящик не на mail.ru, а bk.ru, то для этого сайта можно ввести индивидуальный алгоритм ввода {USERNAME} {TAB} {PASSWORD} {TAB} {DOWN} {DOWN} {DOWN} {TAB} {ENTER} .

Перечень команд здесь приведен, так же имеется справка, хоть она и на английском, но при желании можно разобраться. Из своей же практики посоветовал бы иногда пользоваться командой {DELAY 1000} , это команда задержки между командами. Просто бывает, что при медленном интернете, браузер не успевает принять последовательность команд, по этому, ему нужно время на обдумывание, в данной ситуации выручит эта команда (5000 - 5 секунд задержки).

4) Двойное усложнение набора - при данном методе, программа не вводит данные в явном виде, она часть логина и пароля берет из буфера обмена, а часть вводит символами.

Теперь проверим, сможет ли LanAgent вскрыть наши пароли!? Как вы видите, ничего вытащить не получилось, а, следовательно, программа отлично отработала и теперь ваши пароли максимально защищены!

  • Tutorial

На днях мне нужно было реализовать расшифровку базы данных KeePass. Меня поразило то, что нет ни одного документа и ни одной статьи с исчерпывающей информацией об алгоритме расшифровки файлов.kdb и.kdbx с учетом всех нюансов. Это и побудило меня написать данную статью.


На данный момент существует 2 версии KeePass:

  • KeePass 1.x (генерирует файлы.kdb);
  • KeePass 2.x (генерирует файлы.kdbx).

Структура файла с базой данных KeePass (.kdb, .kdbx) состоит из 3 частей:

  • Подпись (не зашифрована);
  • Заголовок (не зашифрован);
  • Данные (зашифрованы).

Расшифровка базы данных KeePass

Последовательность действий :
  1. Читаем подпись базы данных.
  2. Читаем заголовок базы данных.
  3. Генерируем мастер-ключ.
  4. Расшифровываем базу данных.
  5. Проверяем целостность данных.
  6. Если файл был сжат, распаковываем его.
  7. Расшифровываем пароли.

Пункты 5, 6 и 7 относятся только к.kdbx файлам !

Подпись
BaseSignature (4 байта)

Первая подпись одинакова для.kdb и.kdbx файлов. Она говорит о том, что данный файл является базой данных KeePass:

  • 0x9AA2D903
VersionSignature (4 байта)

Bторая подпись указывает на версию KeePass и, следовательно, отличается для.kdb и.kdbx файлов:

  • 0xB54BFB65 - KeePass 1.x (файл.kdb).
  • 0xB54BFB66 - KeePass 2.x pre-release (файл.kdbx).
  • 0xB54BFB67 - KeePass 2.x post-release (файл.kdbx).
FileVersion (4 байта)

Третья подпись есть только у файлов.kdbx и содержит в себе версию файла. Для файлов.kdb данная информация содержится в заголовке базы данных.


Таким образом, в KeePass 1.x длина подписи составляет 8 байт, а в KeePass 2.x - 12 байт .

Заголовок

После подписи базы данных начинается заголовок.

Заголовок KeePass 1.x

Заголовок.kdb файла состоит из следующий полей:

  1. Flags (4 байта): данное поле говорит о том, какие виды шифрования использовались при создании файла:
    • 0x01 - SHA256;
    • 0x02 - AES256;
    • 0x04 - ARC4;
    • 0x08 - Twofish.
  2. Version (4 байта): версия файла.
  3. Master Seed (16 байт): используется для создания мастер-ключа.
  4. Encryption IV (16 байт): используется для расшифровки данных.
  5. Number of Groups (4 байта): общее количество групп в базе данных.
  6. Number of Entries (4 байта): общее количество записей в базе данных.
  7. Content Hash (32 байта): hash расшифрованных данных.
  8. Transform Seed (32 байта): используется для создания мастер-ключа.
  9. Transform Rounds (4 байта): используется для создания мастер-ключа.
Заголовок KeePass 2.x

В.kdbx файлах каждое поле заголовка состоит из 3 частей:

  1. ID поля (1 байт): возможные значения от 0 до 10.
  2. Длина данных (2 байта).
  3. Данные ([длина данных] байт)

Заголовок.kdbx файла состоит из следующий полей:

  • ID=0x01 Comment: данное поле может быть представлено в заголовке, но в моей базе данных его не было.
  • ID=0x02 Cipher ID: UUID, указывающий на используемый метод шифрования (например, для AES 256 UUID = ).
  • ID=0x03 Compression Flags: ID алгоритма, использующегося для сжатия базы данных:
    • 0x00: None;
    • 0x01: GZip.
  • ID=0x04 Master Seed: используется для создания мастер-ключа.
  • ID=0x05 Transform Seed: используется для создания мастер-ключа.
  • ID=0x06 Transform Rounds: используется для создания мастер-ключа.
  • ID=0x07 Encryption IV: используется для расшифровки данных.
  • ID=0x08 Protected Stream Key: используется для расшифровки паролей.
  • ID=0x09 Stream Start Bytes: первые 32 байта расшифрованной базы данных. Они используются для проверки целостности расшифрованных данных и корректности мастер-ключа. Эти 32 байта рандомно генерируются каждый раз, когда в файле сохраняются изменения.
  • ID=0x0A Inner Random Stream ID: ID алгоритма, использующегося для расшифровки паролей:
    • 0x00: None;
    • 0x01: ARC4;
    • 0x02: Salsa20.
  • ID=0x00 End of Header: последнее поле заголовка базы данных, после него начинается сама база данных.
Генерация мастер-ключа

Генерация мастер-ключа происходит в 2 этапа:

  1. Генерация составного ключа;
  2. Генерация мастер-ключа на основе составного ключа.
1. Генерация составного ключа

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


KeePass 1.x



KeePass 2.x



Обращаю внимание на то, что если для расшифровки базы данных необходимо несколько сущностей (например, пароль и файл-ключ), то сначала нужно получить хэш от каждой сущности, а потом соединить их вместе (concat) и взять хэш от объединенной последовательности.

2. Генерация мастер-ключа на основе составного ключа
  1. Нужно зашифровать составной ключ, полученный выше, с помощью алгоритма AES-256-ECB.
    • В качестве ключа нужно использовать Transform Seed из заголовка.
    • Данное шифрование нужно произвести Transform Rounds (из заголовка) раз.
  2. С помощью SHA256 получаем хэш от зашифрованного составного ключа.
  3. Соединяем Master Seed из заголовка с полученным хэшем.
  4. С помощью SHA256 получаем хэш от объединенной последовательности - это и есть наш мастер-ключ!

Псевдокод

void GenerateMasterKey() { //шифруем составной ключ TransformRounds раз for(int i = 0; i < TransformRounds; i++) { result = encrypt_AES_ECB(TransformSeed, composite_key); composite_key = result; }

//получаем хэш от зашифрованного составного ключа hash = sha256(composite_key); //объединяем полученный хэш с полем MasterSeed из заголовка key = concat(MasterSeed, hash); //получаем хэш от объединенной выше последовательности master_key = sha256(key);

Расшифровка данных KeePass 1.x

Сразу после заголовка начинается сама зашифрованная база данных. Алгоритм расшифровки следующий:

  1. Весь оставшийся кусок файла расшифровываем
  2. С помощью SHA256 получаем хэш от расшифрованных данных (байты из предыдущего пункта не учитываем ).
  3. Проверяем, что полученный хэш совпадает с полем Content Hash из заголовка:
    • eсли хэш совпадает, то мы успешно расшифровали нашу базу данных! Можно сохранить расшифрованные данные как.xml файл и убедиться, что все логины с паролями расшифрованы верно,
    • eсли хэш не совпадает, это значит, что либо был предоставлен не верный пароль или файл-ключ, либо данные были повреждены.

Псевдокод

bool DecryptKeePass1x() { //определяем длину зашифрованной БД //(размер файла - размер подписи - размер заголовка) db_len = file_size - signature_size - header_size;

//расшифровываем данные decrypted_data = decrypt_AES_256_CBC(master_key, EncryptionIV, encrypted_data); //узнаем количество "лишних" байт extra = decrypted_data; //получаем хэш от данных (без учета extra байт!) content_hash = sha256(decrypted_data[:(db_len - extra)]); //проверяем, что полученный хэш совпадает с полем СontentHash из заголовка if (СontentHash == content_hash) return true; else return false;

Расшифровка данных KeePass 2.x

Сразу после поля End of Header заголовка начинается сама зашифрованная база данных. Алгоритм расшифровки следующий:

  1. Весь оставшийся кусок файла расшифровываем с помощью алгоритма AES-256-CBC.
    • В качестве ключа используем сгенерированный выше мастер-ключ.
    • В качестве вектора инициализации используем Encryption IV из заголовка.
  2. Последние несколько байт расшифрованной базы данных являются лишними - это несколько одинаковых байт в конце файла (padding). Чтобы устранить их влияние, нужно прочитать последний байт расшифрованной БД - это то количество «лишних» байт, которое в дальнейшем учитывать не надо.
  3. Проверяем, что первые 32 байта расшифрованной базы данных совпадают с полем Stream Start Bytes заголовка:
    • eсли данные совпадают, значит мы сгенерировали правильный мастер-ключ,
    • eсли данные не совпадают, это значит, что либо был предоставлен неверный пароль, файл-ключ или WUA, либо данные были повреждены.
  4. Если предыдущий пункт выполнен успешно, отбрасываем первые 32 байта. Проверяем поле Compression Flags заголовка. Если было использовано GZip сжатие файла, то распаковываем данные.
  5. Приступаем к проверке целостности данных. Данные разбиты на блоки, максимальный размер блока равен 1024*1024. Каждый блок данных начинается с заголовка. Структура заголовка следующая:
    • ID блока (4 байта): номер блока начиная с 0;
    • Хэш данных блока (32 байта);
    • Размер блока (4 байта).
  6. Следовательно, порядок действий следующий:
    • Считываем заголовок блока.
    • Считываем данные блока.
    • С помощью SHA256 получаем хэш от данных блока.
    • Проверяем, что хэш совпадает с хэшем из заголовка.
  7. Осуществляем последовательность действий из предыдущего пункта для каждого блока данных. Если данные во всех блоках сохранны, то вырезаем все заголовки блоков, и полученная последовательность и есть расшифрованная база данных.
  8. ВНИМАНИЕ : даже в расшифрованном.kdbx файле пароли могут находиться в зашифрованном виде.
  9. Сохраняем расшифрованные и обезглавленные данные как.xml файл.
  10. Находим в нем все ноды с именем «Value», атрибутом «Protected», значением этого атрибута «True» и берем значения этих нод. Это и есть все еще зашифрованные пароли.
  11. Декодируем все зашифрованные пароли с помощью алгоритма base64decode.
  12. В поле Inner Random Stream ID заголовка смотрим, какой алгоритм использовался при шифровании паролей. В моем случае это был Salsa20.
  13. Генерируем псевдослучайную 64 байтную последовательность с помощью алгоритма Salsa20:
    • В качестве ключа используем хэш поля Protected Stream Key заголовка, полученный с помощью SHA256.
    • В качестве вектора инициализации используем константную 8-ми байтную последовательность 0xE830094B97205D2A.
  14. ВАЖНО: С помощью этой 64 байтной последовательности можно расшифровать ровно 64 символа по порядку соединенных вместе декодированных паролей . Если этого недостаточно для расшифровки всех паролей, нужно сгенерировать следующую псевдослучайную последовательность и продолжить расшифровку паролей и т.д. до конца.
  15. Для получения финального пароля, необходимо сделать XOR декодированного с помощью base64decode пароля с псевдослучайной последовательностью, полученной в предыдущем пункте (более понятно последовательность действий представлена в псевдокоде ниже).
  16. ОЧЕНЬ ВАЖНО : пароли должны расшифровываться по порядку! Именно в той последовательности, в которой они представлены в xml файле.
  17. Находим в xml файле все ноды с именем «Value», атрибутом «Protected», значением этого атрибута «True»:
    • Заменяем значение атрибута на «False».
    • Значение ноды заменяем расшифрованным паролем.
  18. И вот только теперь мы получили полностью расшифрованную базу данных KeePass 2.x! Ура!=)

Псевдокод

bool DecryptKeePass2x() { //определяем длину зашифрованной БД //(размер файла - размер подписи - размер заголовка) db_len = file_size - signature_size - header_size;

//расшифровываем данные decrypted_data = decrypt_AES_256_CBC(master_key, EncryptionIV, encrypted_data); //узнаем количество "лишних" байт extra = decrypted_data; db_len -= extra; //проверяем, что первые 32 байта расшифрованной БД //совпадают с полем StreamStartBytes заголовка if (StreamStartBytes != decrypted_data) return false; //отбрасываем эти 32 байта db_len -= 32; decrypted_data += 32; //проверяем поле CompressionFlag заголовка //если файл был сжат, распаковываем его if (CompressionFlag == 1) unzip(decrypted_data); //проверяем целостность данных while (db_len > (BlockHeaderSize)) { //считываем заголовок базы данных block_data = decrypted_data; decrypted_data += BlockHeaderSize; db_len -= BlockHeaderSize; if (block_data.blockDataSize == 0) { break; } //получаем хэш данных блока hash = sha256(decrypted_data); //проверяем, что полученный хэш совпадает с хэшем из заголовка if(block_data.blockDataHash == hash) { pure_data += decrypted_data; decrypted_data += block_data.blockDataSize; db_len -= block_data.blockDataSize; } else { return false; } } //сохраняем расшифрованные и обезглавленные данные как xml файл xml = pure_data.ToXml(); //получаем хэш от поля ProtectedStreamKey заголовка key = sha256(ProtectedStreamKey); //инициализируем алгоритм Salsa20 IV_SALSA = 0xE830094B97205D2A; salsa.setKey(key); salsa.setIv(IV_SALSA); stream_pointer = 0; key_stream = salsa.generateKeyStream(); //расшифровываем пароли while(true) { //находим следующую попорядку ноду с именем "Value", //атрибутом "Protected", значением атрибута "True" node = xml.FindNextElement("Value", "Protected", "True"); if (node == NULL) { break; } //берем значение ноды и декодируем с помощью алгоритма base64decode decoded_pass = base64decode(node.value); //расшифровываем пароль с помощью псевдослучайной последовательности key_stream for (int i = 0; i < len(decoded_pass); i++) { decoded_pass[i] = decoded_pass[i] ^ key_stream; stream_pointer++; //если 64 байтной псевдослучайной последовательности не хватило, //генерируем еще одну последовательность if (stream_pointer >= 64) { key_stream = salsa.generateKeyStream(); stream_pointer = 0; } } //заменяем значение атрибута "Protected" на "False" node.attribute.value = "False"; //заменяем зашифрованный пароль дешифрованным node.value = decoded_pass; } return true;


Вот в общем-то и все, что я хотела рассказать. Надеюсь данное руководство избавит кого-нибудь от лишней головной боли и будет познавательным и информативным=)

Теги:

  • cryptography
  • keepass
  • aes-256
  • sha256
Добавить метки


top