Здравствуйте!
Не так давно у меня возникла идея о создании своей личной программы для бэкапа паролей Google Chrome. Да, в интернете очень много подобных программ, но результат паранойи (что пароли сливаются на чей то сервер «про запас»), да и желание узнать, чем дышит любимый браузер — перевесили чашу весов.
Рассказывать буду на основе ОС Windows 7.
Начну с того — где хранится файл с паролями. Этот файл — "Login Data" в папке "C:\Users\SomeUser\AppData\Local\Google\Chrome\User Data\Default\".
Это база данных SQLite.
В ней есть 14 колонок. Нас же интересуют только 3: origin_url (ссылка на сам сайт), username_value (логин), password_value(пароль). Среди других колонок есть так же: страница авторизации, название элемента ввода для логина и пароля и другие. Все данные незашифровыванны(видно на скрине), кроме поля password_value.
В поле с паролем находится байтовый массив. Выглядит он следующим образом.
Способ шифрования выбран очень удобный для разработчиков. Они использовали Data Protection Application Programming Interface (отличная статья (как оказалось позже и единственная), которая описывает принципы работы этой системы), который использует Windows.
Подробнее информация в ссылке, тем более эта система шифрования заслуживает отдельной темы. Вкратце скажу, что эта система работает в одном из 2 режимов.
- С использованием машинного ключа.
Ключ уникален для текущей системы. Но он позволяет разным программам работать с зашифрованными данными без передачи ключа друг — другу, но исключая утечку данных за пределы машины, а точнее пользователя. - С использованием ключа пользователя.
Без комментариев.
Так же стоит отметить, что эту систему безопасности использует всем известный IE версии 7 и старше. Защита в ней устроена ещё на порядок выше, чем у Google Chrome. Там используется вдобавок ещё и энтропия, а в качестве хранилища — используется реестр. Разработчики Microsoft'а приятно удивили.
В конце статьи есть исходный код программы. Основные её моменты мы сейчас разберем.
Итак — начнем!
Нам будет необходимо считать байты поля с паролем, так как хранится пароль именно в байтовом массиве. Для этого я использовал System.Data.SQLite Interop Library версии 1.0.65.0 (есть в архиве).
В проекте использован класс DPAPI, который был найден в интернете. На момент создания проекта не было цели написания статьи, так что автор класса утерян, но снимаю перед ним шляпу — работа проделана серьезная.
Объявим нужные нам объекты и переменные:
Далее мы заполняем DataTable DB базой данных из нашего файла:
Теперь осталось только вытащить нужную информацию из неё и записать в файл. На этом этапе файл уже не используется — работа ведется только с объектом DataTable:
В итоге у нас есть HTML-документ с нашими логинами-паролями, которые можно хранить на своем мобильном телефоне, или распечатать и положить в конверт… При желании можно записывать больше полей, но лично мне хватает выше упомянутых трех.
Если есть вопросы — с удовольствием отвечу. Большое спасибо за внимание!
Исходники программы
P.S. Если у Вас 64-битная операционная система, то Вам следует заменить файл библиотеки на тот, что находится в корневой папке архива. Я не гарантирую, что данная программа будет работать на Windows XP, или других ОС. Так как проверялось только на Windows 7.