Мне надоело постоянно использовать Google Authentificator и переключаться между ПК и телефоном для подтверждения двухфакторной аутентификации. Поэтому я сделал эту TUI, которая позволит хранить, управлять, просматривать, копировать 2FA ключ в пару нажатий.
Go2FA TOTP - это легковесное, терминальное приложение, предназначенное для безопасного хранения и управления вашими ключами Time-Based One-Time Password (TOTP).
TUI основан на bubbletea
- Безопасное хранение: Хранилище TOTP хранит ваши секретные в зашифрованном виде, гарантируя безопасность вашей чувствительной информации.
- Быстрый доступ: Легко копируйте коды TOTP с помощью одной команды, устраняя необходимость ручного ввода кодов или переключения между приложениями.
- Фильтрация: Организуйте свои TOTP-коды с помощью пользовательских имен, описание, что позволяет легко найти и получить доступ к кодам, которые вам нужны.
- Легковесность: Хранилище TOTP - это терминальное приложение, требующее минимальных системных ресурсов и не имеющее зависимостей, написанное на Go.
Homebrew (Linux/MacOS)
Убедитесь, что стоит Xclip или Xsel. Иначе не будет работать копирование.
brew install curkan/public/go2fago install github.com/curkan/go2fa@latestСкачайте последний релиз и добавьте бинарник в ваш PATH.
Запустите с помощью команды go2fa
На экране просмотра ключей вы можете фильтровать, удалять и копировать нужный 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
└── stores
backups - при добавлении/удалении ключей создаются бекапы с временем, когда произошло изменение. Это позволит вам восстановить нужную версию. Файлы бекапов шифрвуются, как и основной файл vault.json
keys - хранятся privateKey и publicKey
└── keys
├── private.pem
└── public.pem
stores - хранилища, на текущий момент только vault.json
-
Запуск всех тестов:
go test ./...- с покрытием:
go test ./... -cover
-
Где писать тесты:
- Рядом с кодом, в файлах вида
*_test.goвнутри соответствующих пакетов, например:internal/crypto/crypto_test.go,internal/addkey/addkey_test.go,internal/deletekey/deletekey_test.go,internal/twofactor/generate_test.go.
- Рядом с кодом, в файлах вида
-
Изоляция от реальной среды:
- Для тестов используется in-memory файловая система через
afero. Это исключает любые изменения в реальном$HOME/.local/share/go2fa. - Базовый шаблон для тестов:
- Для тестов используется in-memory файловая система через
import (
"testing"
"go2fa/internal/crypto"
"github.com/spf13/afero"
)
func TestSomething(t *testing.T) {
crypto.FS = afero.NewMemMapFs() // изолированный FS
t.Setenv("HOME", "/home/test") // детерминированные пути
crypto.CreateDirs()
crypto.GeneratePublicPrivateKeys()
// ... тестовая логика ...
}- Добавить синхронизацию в Git репозиторием
- Добавить короткие команды, для быстрого получения в clipboard нужного TOTP
- Экран восстановления из бекапа
GO2FA лицензирован в соответствии с условиями лицензии MIT. Полный текст лицензии можно найти в файле LICENSE.

