Предисловие
Привет! Хочу поделиться историей о том, как я победил во внутривузовском конкурсе «Мой первый Start-up» и занял призовое место.
В далёком 2017 году, заканчивая магистратуру технического университета, я разрабатывал приложение — менеджер паролей на базе Xamarin. Это фреймворк для кроссплатформенной разработки мобильных приложений (iOS, Android, Windows Phone) с использованием языка C#.
Поддержка Xamarin была завершена 1 мая 2024 года. Сейчас эта технология больше не развивается и официально не поддерживается корпорацией Microsoft. По сути, Xamarin “вымер” — он не выдержал конкуренции с такими фреймворками, как React Native, Flutter и набирающим популярность Kotlin Multiplatform (KMP).
Но тогда, в 2017 году, идея написать приложение сразу для трёх платформ казалась очень перспективной — и я с энтузиазмом взялся за код.
Основная идея
Основная идея моего менеджера паролей — полная независимость от базы данных, интернета и любых хранилищ логинов и паролей. Вместо хранения паролей, он генерирует их заново каждый раз, когда это нужно. Всё, что требуется от пользователя — ввести мастер-пароль, логин и название сервиса (например, сайта). Этого достаточно, чтобы получить уникальный, сложный пароль для конкретного сервиса.
Такой подход исключает необходимость хранения зашифрованных паролей, а значит — не нужно синхронизировать базы между устройствами, экспортировать, импортировать или доверять свои данные облачным сервисам. Всё генерируется прямо на месте, только тогда, когда нужно.
Но есть и очевидные недостатки. Сейчас многие сервисы требуют регулярной смены паролей. Кроме того, если пароль скомпрометирован, сгенерировать новый уже не получится — ведь алгоритм всегда выдаёт один и тот же результат для одних и тех же входных данных. Это и стало ключевой проблемой, которую нужно было решить, чтобы сделать такой менеджер паролей действительно пригодным для повседневного использования.
Конечно, можно было бы добавить дополнительный параметр — например, номер версии пароля или дату его создания. Это позволило бы генерировать новые пароли при необходимости. Однако такой подход сильно усложнил бы использование: от пользователя потребовалось бы запоминать ещё один параметр или где-то его хранить. В результате менеджер паролей стал бы менее удобным и интуитивно понятным — особенно для тех, кто хочет просто ввести логин, сайт и сразу получить нужный пароль.
Алгоритм шифрования
Как я уже ранее говорил, в основе генерации пароля лежит комбинация из трёх параметров: мастер-пароль, логин и название сервиса (например, сайта). Эти данные объединяются в одну строку, которая служит входом для симметричного шифрования по алгоритму “Кузнечик” (ГОСТ Р 34.12-2015). В качестве ключа шифрования используется хеш от мастер-пароля, полученный с помощью алгоритма “ГОСТ Р 34.11-2012 (“Стрибог”)., что обеспечивает предсказуемость результата при одинаковом вводе данных.
После шифрования получается зашифрованный бинарный блок данных. Результат шифрования интерпретируется с использованием заранее подготовленного набора символов, включающего:
- Заглавные и строчные латинские буквы (A-Z, a-z)
- Цифры (0–9)
- Специальные символы (например, !@#$%^&*)
Каждый байт результата шифрования отображается в один из символов этого набора. В процессе преобразования отбираются символы для формирования пароля, соблюдая заданные правила (например, минимум по 2 символа каждого типа). На выходе получается 16-символьный сложный пароль, который соответствует требованиям безопасности большинства сервисов.
Подготовка и выступление
Чтобы участвовать в конкурсе, помимо самой MVP-программы, нужно было аргументировать актуальность проблемы, предоставить анализ рынка, представить гипотезы и расчёты, а также составить бизнес-план для дальнейшей разработки. В этом мне сильно помогли преподаватели — спасибо им большое, без их помощи я бы не смог занять призовое место. Само выступление прошло спокойно: хотя у меня было немного опыта публичных выступлений, я чувствовал себя уверенно и всё прошло хорошо.

Итог
В результате жюри выбрало мою работу и присудило денежное вознаграждение для дальнейшей разработки. Однако, как я уже упоминал, проект не продвинулся дальше из-за значительного ограничения, которое я не смог обойти удобным способом. Но, возможно, я вернусь к нему в будущем — кто знает :-)
Спасибо, увидимся в других статьях!