четверг, 23 августа 2018 г.

Компьютерная программа PasswordKeeper для безопасного хранения паролей и заметок к ним

Трунов Д.Н.
Компьютерная программа PasswordKeeper для безопасного хранения паролей и заметок к ним

Введение
По оценкам специалистов, средний пользователь имеет около 26 защищаемых паролем аккаунтов [1]. Заучить на память такое количество паролей практически невозможно, поэтому многие пользователи прибегают к различным ухищрениям, используя один и тот же пароль на нескольких сайтах или используя слишком лёгкие комбинации. Эксперты, анализируя выложенные в сети данные с сайтов, взломанных хакерами, замечают, что около 20% пользователей выбирают очень простые и схожие пароли, например «123456» или «Password» [2]. Все подобные ухищрения не являются безопасными по тем или иным причинам.
Наилучшим способом хранения паролей по совокупности надёжности и удобства является использование специальных программ – менеджеров паролей. Однако, наряду со своими преимуществами, у каждого менеджера паролей есть и свои недостатки, в том числе отсутствие бесплатной версии (например, 1Password) или её ограничения. Так, в бесплатной версии Kaspersky Password Manager можно сохранять до 15 паролей, а менеджер паролей от компании Avast устанавливается на ПК только вместе с антивирусом Avast.
Самый известный из полностью бесплатных менеджеров KeePass Password Safe обладает устаревшим дизайном и потенциальными уязвимостями в применении подключаемых плагинов, написанных независимыми авторами [3]. Потенциально уязвимым является и LastPass, который предоставляет возобновление доступа к паролям даже без знания мастер-пароля. И хотя для этого принимаются меры безопасности, нет полной уверенности в отсутствии способов обойти эти меры злоумышленниками.

Общая характеристика программы PasswordKeeper
Программа PasswordKeeper представляет собой альтернативное решение для хранения личных паролей пользователя, простое и безопасное. Программа не требует установки, может легко переноситься и запускается на любом компьютере с установленной платформой .NET Framework или Mono [4]. Как и в случае с другими менеджерами, для защиты сохраняемых паролей применяется мастер-пароль, единственный требующий запоминания.
В программе реализован только самый необходимый функционал: возможность добавлять, просматривать, редактировать и удалять пароли, перемещать их и производить по ним поиск. Есть возможность заменять мастер-пароль, а также создавать и работать с резервными копиями хранилища паролей. Также имеются несколько дополнительных инструментов, таких как генератор случайных паролей и виртуальная клавиатура.
Программа написана на языке программирования C# (среда разработки Microsoft Visual C# 2008), предназначена для работы в GUI-среде (graphics user interface – графический интерфейс пользователя) и для взаимодействия с пользователем предлагает главное (рисунок 1) и ряд вспомогательных окон. Для простоты реализации в интерфейсе программы применяются только стандартные элементы управления языка C# и библиотеки System.Windows.Forms [5].

Концепция хранения паролей
Для хранения паролей PasswordKeeper использует специальный файл-хранилище, который располагается в одном каталоге вместе программой. При каждом запуске программа открывает этот файл автоматически (или создаёт, если его нет). Пароли добавляются и хранятся в этом файле в виде записей (рисунок 2), включающих в себя заголовок (название) записи, непосредственно пароль и заметку к нему. Заметка предназначена для дополнительных сведений и не является обязательной.

Рисунок 1 – Главное окно с открытым опытным хранилищем

Рисунок 2 – Пример открытой парольной записи

Для упрощения структуры хранилища пароль с заметкой объединяются в единое поле при сохранении, а при открытии записи они снова разделяются. Заголовок и пароль могут иметь допустимую длину от 1 до 255 символов каждый, а объединённый пароль с заметкой может содержать до 4095 символов. Поскольку в программе применяется кодировка текста Unicode, то символом считается его двухбайтный код. Если какой-то символ занимает 4 байта, они считаются как два символа.
При добавлении записи в хранилище она обязательно шифруется по алгоритму ESCK-5 [6]. Для этого на основе мастер-пароля создаются два ключа шифрования: лёгкий и тяжёлый. Основное их различие заключается в применяемых циклах шифрования. Лёгким ключом с небольшим количеством циклов шифруются заголовки записей, чтобы их быстрее расшифровывать при открытии хранилища и построении списка. Тяжёлым ключом с большим количеством циклов шифруются пароли (с заметками), которые будут расшифровываться только в момент открытия записи.
Ключи вычисляются таким образом, чтобы даже вскрытие лёгкого ключа не позволило злоумышленникам узнать мастер-пароль и/или получить тяжёлый ключ. Схема вычисления выглядит следующим образом:
1. На основе мастер-пароля генерируется тяжёлый ключ с циклами шифрования, заданными пользователем.
2. По заранее установленному шаблону генерируется лёгкий ключ с установкой режима, при котором ключ меняется при участии блока шифруемых данных (блок данных добавляется к ключу по специальному алгоритму). Временно применяется большое количество циклов шифрования.
3. Создаётся временный массив, заполняемый по установленному шаблону, и шифруется тяжёлым ключом.
4. Тот же массив шифруется лёгким ключом, причём сам ключ меняется при участии содержимого массива.
5. В лёгком ключе устанавливается простой режим шифрования (когда ключ больше не меняется при участии шифруемых данных) и устанавливается небольшое количество циклов шифрования. Ключи готовы.
Для контроля отсутствия искажений созданных ключей во время работы программы в начале работы ими зашифровываются две контрольные строки: одна лёгким ключом, вторая – тяжёлым. При добавлении или изменении записи, когда она уже зашифрована и готова к сохранению, выполняется расшифровка контрольных строк. При обнаружении ошибки сохранение отменяется и пользователю выдаётся предупреждающее сообщение.

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

Рисунок 3 – Окно установки пароля и параметров нового профиля

Имя профиля необходимо, чтобы различать создаваемые хранилища. Для каждого экземпляра программы может быть создан единственный файл-хранилище. Но, поскольку экземпляров программы может быть несколько (в разных каталогах), то столько же может быть и файлов-хранилищ. Чтобы в них не путаться, их можно различать по имени профиля.
Для корректной работы при создании хранилища в него изначально записывается некоторая техническая информация: идентификатор программы, количество циклов шифрования, имя профиля и зашифрованное имя профиля. Шифрование имени профиля необходимо для проверки мастер-пароля при открытии хранилища и выполняется лёгким ключом.
Хотя лёгкий ключ шифрует быстрее тяжёлого (обычно), на его создание нужно больше времени, что должно затруднить возможность взлома мастер пароля методом «грубой силы» (полным перебором возможных вариантов) [7], поскольку для каждого варианта придётся вычислять и тяжёлый, и лёгкий ключи, а это затратно по времени.
При открытии существующего хранилища программа требует только ввести мастер-пароль, а имя профиля и количество циклов шифрования считывает из файла. На основе введённого мастер-пароля создаются тяжёлый и лёгкий ключи, расшифровывается имя профиля. Если расшифровка выполнилась успешно, хранилище загружается в память программы, расшифровываются названия записей и выводятся в список в главном окне. Программа готова к работе.

Контроль PIN-кода
Если шифрование призвано защитить сохранённые пароли от взлома, то PIN-код защищает пароли в открытой программе на оставленном без присмотра компьютере. При каждом вводе мастер-пароля программа требует установить 4-значный PIN-код сессии (рисунок 4 слева), который будет действовать до закрытия программы или выполнения сброса (если PIN-код не установить, хранилище не будет загружено). Далее при каждой ключевой операции с паролями (открытие, изменение или удаление), понадобится опять ввести тот же PIN-код (рисунок 4 справа). Если код будет введён неверно, операция не выполнится.
               
Рисунок 4 – Окна установки (слева) и проверки (справа) PIN-кода сессии

После трёх неверных попыток ввода PIN-кода хранилище закрывается, а ключи шифрования удаляются. Возобновить доступ к хранилищу можно после его повторного открытия (меню «Файл-Переподключиться»), ввода мастер-пароля и установки нового PIN-кода сессии.
При частом обращении к паролям проверку PIN-кода можно временно отключить. Для этого при очередной его проверке нужно установить флажок «Не спрашивать ближайшие 10 минут». Тогда на протяжении этого времени PIN-код не будет запрашиваться, но по истечении 10 минут проверка возобновится.

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

Рисунок 5 – Окно работы с резервными файлами

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

Замена и восстановление мастер-пароля
Замена мастер-пароля хранилища производится в соответствующем окне (рисунок 6), в котором нужно ввести текущий и новый мастер-пароль. При необходимости можно также поменять имя профиля и/или количество циклов шифрования. Если текущий мастер-пароль введён правильно, программа расшифрует все записи прежними ключами, вычислит новые ключи на основе нового мастер-пароля, зашифрует обратно все записи и сохранит в хранилище.

Рисунок 6 – Окно замены мастер-пароля

Исходя из соображений безопасности, программа нигде не сохраняет мастер-пароль в открытом виде, а применение шифрования с большим количеством циклов делают практически невозможным вскрытие мастер-пароля или открытие хранилища без знания его. Но это же значит, что если пользователь забудет свой мастер-пароль, то он никак не сможет открыть своё хранилище.
Возможно, пользователь захочет где-то сохранить свой мастер-пароль. Чтобы не сохранять его в открытом виде, программа предлагает сгенерировать код восстановления. Для этого нужно в специальном окне (рисунок 7) ввести пароль восстановления и свой мастер-пароль. Фактически, программа тщательно зашифровывает мастер-пароль ключом, созданным на основе пароля восстановления. Для восстановления мастер-пароля в том же окне нужно ввести пароль и код восстановления. Рекомендуется хранить пароль и код восстановления в надёжном месте отдельно друг от друга.
  
Рисунок 7 – Окно восстановления пароля

Вспомогательные инструменты
Одним из вспомогательных инструментов является встроенная виртуальная клавиатура, которая представляет собой базовую защиту от шпионских программ и может быть использована во всех случаях ввода пароля или мастер-пароля (по нажатию кнопки «Клавиатура» возле соответствующего поля). Для ввода предлагаются только цифры, латиница нижнего и верхнего регистров и некоторые специальные знаки.
Другим вспомогательным инструментом является генератор паролей (рисунок 8), предназначенный для создания случайных и надёжных паролей. Генератор может запускаться как из главного меню, так и из окон добавления или редактирования записи. Во втором случае сгенерированный пароль можно «применить» – вставить прямо в поле ввода в соответствующем окне. Генерация происходит с участием алгоритма DeepRand [8], случайные данные для которого накапливаются в процессе работы программы.

Рисунок 8 – Встроенный генератор паролей

Заключение
Как и в других менеджерах паролей, в PasswordKeeper работает принцип: вместо запоминания многих паролей достаточно запомнить всего один, а остальные сохранить в программе. Тщательное шифрование сохраняемых данных защищают их от взлома, а контроль PIN-кода защищает работающую программу от любопытных родственников (дома) или коллег (на работе) на оставленном без присмотра компьютере.
Возможность создания резервных копий хранилища паролей и восстановления из них позволяет снизить риски потери данных, а возможность генерации кода восстановления – не забыть мастер пароль. Встроенный генератор паролей позволяет создавать случайные и надёжные пароли, а виртуальная клавиатура обеспечивает более безопасный их ввод в программе.
Среди дополнительных преимуществ программы можно выделить её портативность и возможность запуска (без установки) на многих современных компьютерах с установленной платформой .NET Framework или Mono. Полезной также является возможность работы с несколькими профилями на одном компьютере.

Источники информации
1. Alex Hernandez. [Infographic] Password protection: Why it’s easy for hackers to hack [Электронный ресурс] – URL: https://techaeris.com/2018/05/25/password-protection-easy-hackers-hack
2. Геннадий Печёнкин. Самые популярные и самые опасные пароли в интернете. – «Московский комсомолец» (mk.ru) [Электронный ресурс] – URL: https://www.mk.ru/science/article/2010/01/26/418065-samyie-populyarnyie-i-samyie-opasnyie-paroli-v-internete.html
3.Википедия. KeePass. [Электронный ресурс] – URL: https://ru.wikipedia.org/wiki/KeePass
4 Википедия. Mono. [Электронный ресурс] – URL: https://ru.wikipedia.org/wiki/Mono
5. Шилдт, Герберт. Полный справочник по C#.: Пер. с англ. – М.: Издательский дом «Вильямс», 2004. – 752 с.: ил.
6. Трунов Д.Н. Алгоритм шифрования ESCK-5: описание, принцип работы, исходные тексты [Электронный ресурс] – URL: http://d-raft5.blogspot.com/2018/04/esck-5.html
7. Википедия. Полный перебор. [Электронный ресурс] – URL: https://ru.wikipedia.org/wiki/Полный_перебор
8. Трунов Д.Н. Генератор случайных чисел с механизмом глубокого накопления случайных данных DeepRand [Электронный ресурс] – URL: http://d-raft5.blogspot.com/2018/04/deeprand.html