{"id":37224133,"url":"https://github.com/curkan/go2fa","last_synced_at":"2026-01-15T01:40:06.842Z","repository":{"id":245997223,"uuid":"819741496","full_name":"curkan/go2fa","owner":"curkan","description":"TUI Менеджер TOTP ключей (2FA Manager). Сохраняй, управляй, копируй TOTP.","archived":false,"fork":false,"pushed_at":"2025-08-07T11:35:13.000Z","size":578,"stargazers_count":67,"open_issues_count":1,"forks_count":3,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-08-07T13:29:30.174Z","etag":null,"topics":["2fa","2factor","golang","password-manager","totp","totp-generator","tui"],"latest_commit_sha":null,"homepage":"","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/curkan.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2024-06-25T05:49:24.000Z","updated_at":"2025-08-06T14:46:20.000Z","dependencies_parsed_at":"2024-06-25T09:31:36.654Z","dependency_job_id":"e3b96487-6c11-4a6a-bbd6-558108ba52c1","html_url":"https://github.com/curkan/go2fa","commit_stats":null,"previous_names":["curkan/go2fa"],"tags_count":8,"template":false,"template_full_name":null,"purl":"pkg:github/curkan/go2fa","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/curkan%2Fgo2fa","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/curkan%2Fgo2fa/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/curkan%2Fgo2fa/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/curkan%2Fgo2fa/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/curkan","download_url":"https://codeload.github.com/curkan/go2fa/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/curkan%2Fgo2fa/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28441031,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-15T00:55:22.719Z","status":"ssl_error","status_checked_at":"2026-01-15T00:55:20.945Z","response_time":107,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["2fa","2factor","golang","password-manager","totp","totp-generator","tui"],"created_at":"2026-01-15T01:40:06.123Z","updated_at":"2026-01-15T01:40:06.826Z","avatar_url":"https://github.com/curkan.png","language":"Go","readme":"\u003cp align=\"center\"\u003e\n    \u003cimg src=\"docs/logo.png\" width=\"250\" alt=\"go2fa totp manager\" /\u003e\n    \u003ch5 align=\"center\"\u003eХраните и используйте свои TOTP ключи в терминале\u003c/h5\u003e\n\u003c/p\u003e\n\n---\n\nМне надоело постоянно использовать Google Authentificator и переключаться между ПК и телефоном для подтверждения двухфакторной аутентификации. Поэтому я сделал эту TUI, которая позволит хранить, управлять, просматривать, копировать 2FA ключ в пару нажатий.\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"docs/present.gif\" alt=\"animated\" /\u003e\n\u003c/p\u003e\n\n---\n\n# Описание\n\nGo2FA TOTP - это легковесное, терминальное приложение, предназначенное для безопасного хранения и управления вашими ключами Time-Based One-Time Password (TOTP). \n\nTUI основан на [bubbletea](https://github.com/charmbracelet/bubbletea)\n\n## Функции\n- **Безопасное хранение**: Хранилище TOTP хранит ваши секретные в зашифрованном виде, гарантируя безопасность вашей чувствительной информации.\n- **Быстрый доступ**: Легко копируйте коды TOTP с помощью одной команды, устраняя необходимость ручного ввода кодов или переключения между приложениями.\n- **Фильтрация**: Организуйте свои TOTP-коды с помощью пользовательских имен, описание, что позволяет легко найти и получить доступ к кодам, которые вам нужны.\n- **Легковесность**: Хранилище TOTP - это терминальное приложение, требующее минимальных системных ресурсов и не имеющее зависимостей, написанное на Go.\n\n## Установка\n\n\n### [Homebrew](https://brew.sh) (Linux/MacOS)\n\u003e Убедитесь, что стоит **Xclip** или **Xsel**. Иначе не будет работать копирование. \n\n```shell\nbrew install curkan/public/go2fa\n```\n\n### Из исходника\n\n```shell\ngo install github.com/curkan/go2fa@latest\n```\n\n### Ручная установка\n\nСкачайте [последний релиз](https://github.com/curkan/go2fa/releases/latest) и добавьте бинарник в ваш PATH.\n\nЗапустите с помощью команды `go2fa`\n\n### Просмотр ключей\nНа экране просмотра ключей вы можете фильтровать, удалять и копировать нужный TOTP ключ.\n\n- `d` - вызвать удаление (Enter - подтвердить, Esc - вернуться назад)\n- `enter` - скопировать в буфер обмена. При копировании левая граница становится толще.\n- `/` - фильтрация по имени\n\n### Добавление ключей\nЧтобы добавить новый ключ, введите **Имя** и **SecretKey**, Описание по желанию.\\\nSecretKey формата base32 иначе отобьет ошибку.\n\n## Vault\nИспользуется хранилище в формате JSON для дополнительной информации `vault.json`\\\nПри первом запуске приложение создаст *publicKey* и *privateKey* для шифрования вашего Vault.\n\n```json\n{\n  \"iterator\": 4,\n  \"db\": \"CtSRXlMkbXrMmLh/IeMiJCzRbzJkTMagWGVwnvaOkqroDUViVJaBaMbih258o...\"\n}\n```\n`db` - зашифрованное поле, к котором хранится структура name, description, secretKey\\\n`iterator` - дополнительное поле, которое инкрементируется при каждом изменении хранилища. По iterator можно быстро понять, какая версия была предыдущая и восстановить его из бекапа.\n\nJSON структура с открытым форматом была выбрана для удобного расширения приложения. Не все дополнительные поля должны быть зашифрованы.\n\n\n## Структура файлов\nВсе используемые файлы хранятся в пути: `$HOME/.local/share/go2fa`\n\n```sheel\ngo2fa\n├── backups\n├── keys\n└── stores\n```\n\n\n`backups` - при добавлении/удалении ключей создаются бекапы с временем, когда произошло изменение. Это позволит вам восстановить нужную версию. Файлы бекапов шифрвуются, как и основной файл `vault.json`\n\n`keys` - хранятся privateKey и publicKey\n\n```sheel\n└── keys\n    ├── private.pem\n    └── public.pem\n```\n\n`stores` - хранилища, на текущий момент только vault.json\n\n## Тестирование\n\n- **Запуск всех тестов**: \n  - `go test ./...`\n  - с покрытием: `go test ./... -cover`\n\n- **Где писать тесты**: \n  - Рядом с кодом, в файлах вида `*_test.go` внутри соответствующих пакетов, например: `internal/crypto/crypto_test.go`, `internal/addkey/addkey_test.go`, `internal/deletekey/deletekey_test.go`, `internal/twofactor/generate_test.go`.\n\n- **Изоляция от реальной среды**:\n  - Для тестов используется in-memory файловая система через `afero`. Это исключает любые изменения в реальном `$HOME/.local/share/go2fa`.\n  - Базовый шаблон для тестов:\n\n```go\nimport (\n    \"testing\"\n    \"go2fa/internal/crypto\"\n    \"github.com/spf13/afero\"\n)\n\nfunc TestSomething(t *testing.T) {\n    crypto.FS = afero.NewMemMapFs()   // изолированный FS\n    t.Setenv(\"HOME\", \"/home/test\")  // детерминированные пути\n    crypto.CreateDirs()\n    crypto.GeneratePublicPrivateKeys()\n    // ... тестовая логика ...\n}\n```\n\n## TODO:\n- Добавить синхронизацию в Git репозиторием\n- Добавить короткие команды, для быстрого получения в clipboard нужного TOTP\n- Экран восстановления из бекапа\n\n\n## Авторское право и лицензия\n\nGO2FA лицензирован в соответствии с условиями лицензии MIT. Полный текст лицензии можно найти в файле [`LICENSE`](https://github.com/curkan/go2fa/blob/master/LICENSE).\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcurkan%2Fgo2fa","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fcurkan%2Fgo2fa","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcurkan%2Fgo2fa/lists"}