Как я сделал себе менеджер паролей
Пароли — древнейший способ аутентификации в информационных технологиях, повсеместно использующийся и сегодня. Увы, просто невозможно держать в памяти пароли для всех Интернет-ресурсов при условии, что все они будут разными и сложными! Тут на помощь человеку приходят менеджеры паролей, берущие эту задачу на себя: человек запоминает всего лишь один мастер-пароль, дающий доступ ко всем остальным.
Мне не нравились существующие менеджеры паролей: неудобно синхронизировать базу паролей между различными устройствами и операционными системами, к тому же, зачастую программы-менеджеры откровенно плохо защищены. Однажды я читал статьи по криптографии, и мне пришла в голову мысль: а почему бы не сделать менеджер паролей, который вместо хранения паролей будет вычислять их?
Первый вариант реализации этой идеи, приходящий на ум — криптографические хеш-функции. На первый взгляд, всё круто: выбираем стойкую функцию (скажем, SHA-3 в 224-битной версии), подаём ей на вход мастер-пароль qwerty и тип аккаунта vk, на выходе мгновенно получаем 56 символов из набора 0123456789abcdef. Я сходу нашёл два подобных проекта: взломанный и потенциально взламываемый. В таком подходе есть большая проблема: криптографические хеш-функции проектируются в том числе с целью быть максимально быстрыми и нетребовательными к ресурсам, и поэтому можно устроить словарный или полный перебор мастер-пароля по перехваченному паролю для одного сайта на CPU (относительно медленно), GPU, FPGA (куда быстрее), ASIC (очень быстро). Для проведения таких атак на популярные алгоритмы хеширования без использования подсаливания можно использовать также радужные таблицы, сильно ускоряющие процесс взлома на CPU.
К счастью, есть другой вариант реализации — функции получения ключей. В двух словах, они выполняют хеширование, но относительно медленно (скажем, одну секунду на обычном процессоре) и с относительно большим потреблением ресурсов (скажем, 16 мегабайт оперативной памяти), чтобы максимально затруднить атаки полным и словарным перебором. Среди знакомых мне современных функций PBKDF2, bcrypt и scrypt лучше всего выглядела scrypt: созданная с учётом опыта первых двух, успешно противостоящая вычислениям на графических процессорах и микросхемах (как FPGA, так и ASIC) и рассчитанная на гибкость при настройке под любые задачи. Я подумывал над реализацией этого проекта, но почему-то задвинул его в долгий ящик. И очень напрасно.
Криптограф Надим Кобеисси сделал как раз такой менеджер паролей npwd на JavaScript (работает как десктопное приложение через Node.JS). Я установил утилиту на компьютер под Linux и под Windows, а также на ноутбук под Linux, начал боевое использование, и мне очень понравилось. Вводишь единственный мастер-пароль и тип аккаунта (например, «twitter») в приложение, и через пару секунд в твоём буфере обмена уже лежит вычисленный сложный пароль конкретно для этого аккаунта, причём взломать твой мастер-пароль (читай: все твои пароли) по паролю для одного аккаунта будет очень, очень сложно.
Но была и проблема. Версия под Windows действительно выдавала пароль через пару секунд, а вот под Linux (в том числе на том же самом компьютере!) для вычислений требовалось уже секунд 15, что напрягало. Сначала я просто уменьшил одну константу, сделав мастер-пароль менее защищённым, но потом я подумал — а почему бы не переписать приложение на C, ведь наверняка будет работать гораздо быстрее! Особенно меня подзадоривала мысль, что у меня давно был замысел этого проекта, но я стормозил, и кто-то реализовал его до меня.
Через несколько дней неспешной работы я сделал свой менеджер паролей cpwd, полностью совместимый с оригиналом. Это было весело! После небольшой оптимизации мне удалось достичь желанной высокой скорости работы. Портировать cpwd под Windows я не пробовал, но это должно быть несложно. На GitHub-странице проекта я собрал коллекцию ссылок на подобные проекты в академическом мире и за его пределами – оказалось, что идея вообще-то весьма стара.
Конечно, это не серебряная пуля, но it works for me. В процессе использования я наткнулся на проблему: некоторые сайты имеют интересные требования к паролям типа «не более 20 символов», «обязательно встречается большая буква, маленькая буква, цифра и спецсимвол», в результате сгенерированный npwd/cpwd пароль иногда требует доработки руками перед вводом. К счастью, таких сайтов немного.
Оригинал опубликован в моём блоге 7.08.15. Прошло 5 лет, а я до сих пор пользуюсь этой утилиткой.
Как я сделал себе менеджер паролей
Пароли — древнейший способ аутентификации в информационных технологиях, повсеместно использующийся и сегодня. Увы, просто невозможно держать в памяти пароли для всех Интернет-ресурсов при условии, что все они будут разными и сложными! Тут на помощь человеку приходят менеджеры паролей, берущие эту задачу на себя: человек запоминает всего лишь один мастер-пароль, дающий доступ ко всем остальным. Мне не нравились существующие менеджеры паролей: неудобно синхронизировать базу паролей между различными устройствами и операционными системами, к тому же, зачастую программы-менеджеры откровенно плохо защищены. Однажды в этом году я читал статьи по криптографии, и мне пришла в голову мысль: а почему бы не сделать менеджер паролей, который вместо хранения паролей будет вычислять их?
Первый вариант реализации этой идеи, приходящий на ум — криптографические хеш-функции. На первый взгляд, всё круто: выбираем стойкую функцию (скажем, SHA-3 в 224-битной версии), подаём ей на вход мастер-пароль qwerty и имя аккаунта vk, на выходе мгновенно получаем 56 символов из набора 0123456789abcdef. Я нашёл два подобных проекта: взломанный и потенциально взламываемый. В таком подходе есть большая проблема: криптографические хеш-функции проектируются в том числе с целью быть максимально быстрыми и нетребовательными к ресурсам, и поэтому можно устроить словарный или полный перебор мастер-пароля по перехваченному паролю для одного сайта на CPU (относительно медленно), GPU, FPGA (куда быстрее), ASIC (очень быстро). Для проведения таких атак на популярные алгоритмы хеширования без использования подсаливания можно использовать также радужные таблицы, сильно ускоряющие процесс взлома на CPU.
К счастью, есть другой вариант реализации — функции получения ключей. В двух словах, они выполняют хеширование, но относительно медленно (скажем, одну секунду на обычном процессоре) и с относительно большим потреблением ресурсов (скажем, 16 мегабайт оперативной памяти), чтобы максимально затруднить атаки полным и словарным перебором. Среди знакомых мне современных функций PBKDF2, bcrypt и scrypt лучше всего выглядела scrypt: созданная с учётом опыта первых двух, успешно противостоящая вычислениям на графических процессорах и микросхемах (как FPGA, так и ASIC) и рассчитанная на гибкость при настройке под любые задачи. Я подумывал над реализацией этого проекта, но почему-то задвинул его в долгий ящик. И очень напрасно.
Канадский криптограф Надим Кобеисси, автор отличного мессенджера Cryptocat, пару месяцев назад сделал как раз такой менеджер паролей npwd на JavaScript (работает как десктопное приложение через Node.JS). Я установил утилиту на компьютер под Linux и под Windows, а также на ноутбук под Linux, начал боевое использование, и мне очень понравилось. Вводишь единственный мастер-пароль и название аккаунта (например, “twitter”) в приложение, и через пару секунд в твоём буфере обмена уже лежит вычисленный сложный пароль конкретно для этого аккаунта, причём взломать твой мастер-пароль (читай: все твои пароли) по паролю для одного аккаунта будет очень, очень сложно.
Но была и проблема. Версия под Windows действительно выдавала пароль через пару секунд, а вот под Linux (в том числе на том же самом компьютере!) для вычислений требовалось уже секунд 15, что напрягало. Сначала я просто уменьшил одну константу, сделав мастер-пароль менее защищённым, но потом я подумал — а почему бы не переписать приложение на C, ведь работать будет гораздо быстрее! Особенно меня подзадоривала мысль, что у меня давно был замысел этого проекта, но я стормозил, и кто-то реализовал его до меня.
Через несколько дней неспешной работы я отточил до блеска свой менеджер паролей cpwd, полностью совместимый с оригиналом. Это было весело! Приятными новыми фичами стали режим регистрации, возможность задавать название аккаунта сразу при вызове менеджера и очень высокая скорость работы после небольшой оптимизации. Портировать cpwd под Windows я ещё не пробовал, но это должно быть несложно. Если вы давно хотели начать использовать менеджер паролей, это отличный шанс наконец решиться!
Как создать менеджер паролей
Первый прототип без корпуса
Первый прототип в корпусе из структора
Делаем аппаратный менеджер паролей на базе Arduino
Многие люди до сих пор хранят данные для авторизации в бумажном виде. Очевидно, если кто-то украдёт ваш блокнот, то он получит доступ ко всем вашим аккаунтам — хуже не придумаешь. Ещё одна проблема — человеческий фактор, который не позволяет в полной мере придумывать действительно сложные пароли, которые нельзя будет взломать брут форсом или перебором по словарю. Пользователь seawarrior181 собрал аппаратный менеджер паролей, который решает эти проблемы. Данные всех аккаунтов хранятся внутри устройства, а встроенный генератор поможет создать пароль, который нельзя будет подобрать перебором слов.

Устройство называется PasswordPump. Оно может хранить в себе до 254 учётных записей (название учётной записи + логин + пароль). Данные хранятся на двух съёмных микросхемах памяти в зашифрованном виде, благодаря шифрованию военного уровня AES128.
При желании можно сделать бэкап в текстовый файл или на резервные микросхемы памяти (не зря они съёмные).
Аппаратный менеджер паролей — как он работает?
Это устройство подключается к ПК через USB кабель. Чтобы получить доступ к устройству (ко всем сохранённым аккаунтам в нём), нужно ввести мастер-пароль. После этого в списке вы должны выбрать нужную учётную запись, а на компьютере поставить курсор в форму ввода. Менеджер паролей сам введёт в ПК данные для авторизации.
Добавлять учётные записи в устройство можно нативно или через монитор последовательного порта на ПК.
Сборка устройства
PasswordPump базируется на плате Arduino Pro Micro. Единственный элемент ввода в устройстве — энкодер. Он позволяет считывать повороты ручки и нажатия на неё (прямо как в колёсике мышки). Информация выводится на небольшой OLED дисплей с разрешением 128×32 пикселей. Ещё понадобится RGB-светодиод (он будет показывать текущее состояние устройства), две микросхемы EEPROM-памяти, печатная плата и некоторый обвес. Вот все необходимые детали:

Все компоненты, необходимые для сборки
Вот так выглядит схема устройства и его прототип, собранный на макетной плате:

Схема сборки устройства на макетной плате

Устройство, собранное на макетной плате
Автор выбрал модель Arduino Micro, потому что она базируется на чипе ATmega32u4 с аппаратной поддержкой USB-соединения. Это значит, что микроконтроллер можно использовать как HID-устройство. В данном случае — это клавиатура. Устройство имитирует нажатие клавиш, тем самым вводя данные для авторизации.

Исходный код для микроконтроллера можно найти здесь.
После распайки всех элементов на плате, микроконтроллер нужно подключить к ПК и прошить через Arduino IDE. Но автор советует перепрошивать МК отдельно через программатор, так как в таком случае будет перезаписан и загрузчик, из-за чего в памяти освободится немного места, которого очень мало для этого скетча.
Возможности менеджера паролей
Про базовые возможности уже было рассказано выше — в менеджере паролей можно защищённо хранить данные учётных записей и передавать их на ПК. Но это далеко не все возможности PasswordPump:
- автоматическая очистка памяти и возврат к заводским настройкам после 10 неудачных попыток ввода мастер-пароля;
- учётные данные шифруются с помощью AES128, а мастер-пароль хэшируется с помощью SHA256;
- зашифрованные учётные записи и мастер-пароль посолены;
- устройство не уязвимо для стандартных атак на пароли;
- все данные учётных записей могут быть выгружены в текстовый документ для создания резервной копии в виде файла;
- автоматическая блокировка устройства после 1 часа бездействия (нужно будет повторно ввести мастер-пароль);
- генерация пароля из случайных букв, цифр и символов;
- добавление учётных записей через монитор последовательного порта или на самом устройстве с помощью поворотного энкодера;
- редактирование и удаление существующих учётных записей через ПК или само устройство;
Можно помочь автору в фиксе багов и добавлении новых возможностей в репозитории проекта.