Мне часто требовалось вводить двухфакторные ключи на разные сайты и приложения. Делать это с телефона не особо удобно, хотя есть телефоны, которые могут синхронизировать буфер обмена с ПК или ноутбуком, что упрощает процесс. Однако телефон должен быть всегда при себе. Мне хотелось иметь все в терминале, поскольку я в основном работаю только в нем.
TOTP (Time-Based One-Time Password) - это алгоритм, используемый для генерации одноразовых паролей, основанных на текущем времени. Он используется для реализации двухфакторной аутентификации (2FA) и является одним из наиболее распространенных методов 2FA.
Я пользуюсь gopass для хранения паролей - очень удобная штука, рекомендую, но TOTP она не хранит, либо можно ее расширить, но тоже не удобно.
Тогда решил, что пришла пора создать свою TUI, удобную, красивую и главное, чтобы безопасно.

Разработка
Для создания TUI был выбран фреймворк bubbletea на языке Golang. Этот фреймворк позволяет достаточно быстро и удобно создавать "окна" в терминале, делать всякие выпадающие списки и таблицы, что отлично подходило для данной задачи.
Функции
- Безопасное хранение: Хранилище TOTP хранит ваши секретные в зашифрованном виде, гарантируя безопасность вашей чувствительной информации.
- Быстрый доступ: Легко копируйте коды TOTP с помощью одной команды, устраняя необходимость ручного ввода кодов или переключения между приложениями.
- Фильтрация: Организуйте свои TOTP-коды с помощью пользовательских имен, описание, что позволяет легко найти и получить доступ к кодам, которые вам нужны.
- Легковесность: Хранилище TOTP - это терминальное приложение, требующее минимальных системных ресурсов и не имеющее зависимостей, написанное на Go.
Установка
Homebrew (Linux/MacOS)
Убедитесь, что стоит Xclip или Xsel. Иначе не будет работать копирование.
brew install curkan/public/go2faИз исходника
go install github.com/curkan/go2fa@latestПросмотр ключей
На экране просмотра ключей вы можете фильтровать, удалять и копировать нужный TOTP ключ.
d- вызвать удаление (Enter - подтвердить, Esc - вернуться назад)enter- скопировать в буфер обмена. При копировании левая граница становится толще./- фильтрация по имени
Добавление ключей
Чтобы добавить новый ключ, введите Имя и SecretKey, Описание по желанию.SecretKey формата base32 иначе отобьет ошибку.
Хранилище
Используется хранилище в формате JSON для дополнительной информации vault.jsonПри первом запуске приложение создаст publicKey и privateKey для шифрования вашего Vault.
{
"iterator": 4,
"db": "CtSRXlMkbXrMmLh/IeMiJCzRbzJkTMagWGVwnvaOkqroDUViVJaBaMbih258o..."
}db - зашифрованное поле, к котором хранится структура name, description, secretKey
iterator - дополнительное поле, которое инкрементируется при каждом изменении хранилища. По iterator можно быстро понять, какая версия была предыдущая и восстановить его из бекапа.
JSON структура с открытым форматом была выбрана для удобного расширения приложения. Не все дополнительные поля должны быть зашифрованы.
Структура файлов
Все используемые файлы хранятся в пути: $HOME/.local/share/go2fa
go2fa
├── backups
├── keys
└── storesbackups - при добавлении/удалении ключей создаются бекапы с временем, когда произошло изменение. Это позволит вам восстановить нужную версию. Файлы бекапов шифрвуются, как и основной файл vault.json
keys - хранятся privateKey и publicKey
└── keys
├── private.pem
└── public.pemstores - хранилища, на текущий момент только vault.json
Небольшое заключение
Данной туишкой я пользуюсь буквально каждый день, с учетом того, что поддерживаются VIM управление hjkl, то это происходит вообще в пару кликов. Если подумать на будущее, то это сохраняет очень много времени, ну и просто удобно