Менеджер паролей в виде Telegram Bot

Время от времени мне нравится создавать ботов для Телеграм. Воп-первых, это не требует создания UI (а с ним у меня проблемы). Во-вторых, обычно это проект на пару дней — то что надо для выходного пет проджекта. Пару дней назад я решил сделать телеграмм бота для хранения паролей. Получилось это — https://t.me/SecurePasswordManagerBot.

В рамках игрушечных проектов я обычно хочу сделать две вещи. Во-первых, мне надо изучить что-то новое, ведь только там можно расти, как инженер. Во-вторых, я хочу повеселиться, ведь это не рабочая деятельность, где результат превыше всего. Поэтому, для разработки я выбрал новую для себя платформу — Cloudflare Workers. По сути, это альтернатива AWS Lambda от Амазона (конечно, с сильно урезанным набором возможностей).

Разрабатывать под ворковеров можно либо на JavaScript (нативный режим), либо на C++/Rust/GO, если вы готовы заниматься WebAssembly. Хоть я JS и люблю, решил, что будет быстрее сделать на нем. Ради маленького проекта не захотелось возиться вокруг инфрастуктурного кода для компиляции в wasm.

Для хранилища паролей я заиспользовал второй продукт от CF — Workers KV. Это key value хранилище с eventually consistent моделью. Тут нет ни транзакций, ни чего-то другого. В целом, мне больше ничего и не надо — ведь я просто храню пары название пароля + пароль, а также юзер — список названий паролей.

С криптографией я плох, поэтому пошел в интернеты смотреть, что пишут умные люди, кто занимается секьюрити профессионально. В результате, весь код вокруг криптографии нагло скопировал тут — https://bitwarden.com/help/crypto.

Несколько слов о том, как устроен flow сохранения пароля:

  1. Вы придумали себе пароль. После этого, идете на https://secure-password-manager-bot-web.pages.dev/ и шифруете (AES-CBC) его с помощью вашего мастер пароля.
  2. Вы сохраняете в бота зашифрованный пароль с помощью команды /save
  3. Воркер шифрует второй раз ваш уже и так зашифрованный пароль с помощью другого мастер ключа. Этот ключ хранится в Cloudflare секретах, к нему есть доступ только у кого-то из CF (у меня к нему доступа нет).

В результате, мы имеем, что оригинальный пароль был дважды зашифрвоан. Чтобы расшифровать пароль, нужны 2 разных мастер пароля — ваш и тот, что хранится в CF. В целом, выглядит довольно надежно.

Пара слов про developer experience от JavaScript и Cloudflare Workers. В целом, жить можно. Если бы я строил на этом стеке рабочий проект, я бы занялся автоматизацией — https://developers.cloudflare.com/workers/cli-wrangler, а также посмотрел бы на локальную альтернативу для разработки — https://github.com/cloudflare/miniflare. Конечно, я делал десятки ошибок, когда передавал куда-то не тот тип, что ожидается, но — чего еще ждать от JS?!

Самое главное — я получил a lot of фан. Наверное, это самое главное. Ведь не стоит забывать, что мы пришли в профессию, потому что нам нравится разрабаывать, а не потому что это модно мощно молодежно. Надеюсь, что и в будущем смогу придумывать оригинальные идеи для своих петов.

Категории: Программирование