====== SSH Phrase ====== //**Простая и безопасная утилита для генерации пары SSH-ключей (ED25519) по фразе.\\ Не сохраняет ключи, не использует сеть и не принимает аргументы — всё работает через интерактивное меню.\\ Подходит для защищённого доступа с зашифрованной флешки и персонального использования.**//\\ **Программа в архиве:**\\ {{ :projects:windows:sshphrase.zip |}} (1.25 Mb) в ssh приватном ключе вида -----BEGIN OPENSSH PRIVATE KEY----- b3BlbnNzaC1rZXktZ...много base64 -----END OPENSSH PRIVATE KEY----- обязательно должен быть символ переноса на новую строку в конце файла, иначе будет ошибка при попытке подключения **Исходный код:** ++++sshphrase.go| // sshphrase.go — генерация ED25519-ключей с использованием golang.org/x/crypto/ssh package main import ( "bytes" "crypto/ed25519" "crypto/sha256" "encoding/pem" "fmt" "log" "os" "golang.org/x/crypto/ssh" "golang.org/x/term" ) type Pair struct { Private []byte Public []byte } func PairFromED25519(public ed25519.PublicKey, private ed25519.PrivateKey) (*Pair, error) { privBlock, err := ssh.MarshalPrivateKey(private, "") if err != nil { return nil, err } var buf bytes.Buffer err = pem.Encode(&buf, privBlock) if err != nil { return nil, err } pubKey, err := ssh.NewPublicKey(public) if err != nil { return nil, err } return &Pair{ Private: buf.Bytes(), Public: ssh.MarshalAuthorizedKey(pubKey), }, nil } func main() { fmt.Print("Введите фразу: ") b, err := term.ReadPassword(int(os.Stdin.Fd())) fmt.Println() if err != nil { log.Fatalf("Ошибка чтения фразы: %v", err) } phrase := string(b) seed := sha256.Sum256([]byte(phrase)) privateKey := ed25519.NewKeyFromSeed(seed[:]) publicKey := privateKey.Public().(ed25519.PublicKey) pair, err := PairFromED25519(publicKey, privateKey) if err != nil { log.Fatalf("Ошибка генерации ключей: %v", err) } for { fmt.Println("\nВыберите действие:") fmt.Println("1 - Показать публичный ключ") fmt.Println("2 - Показать приватный ключ") fmt.Println("0 - Выход") fmt.Print("> ") var choice string fmt.Scanln(&choice) switch choice { case "1": fmt.Println("\n📤 Публичный ключ (копируй в authorized_keys):") fmt.Println(string(pair.Public)) case "2": fmt.Println("\n🔐 Приватный ключ (в формате OpenSSH):") fmt.Println(string(pair.Private)) fmt.Println("(Сохрани как id_ed25519 и установи chmod 600)") case "0": fmt.Println("Выход.") return default: fmt.Println("Неверный выбор. Попробуйте снова.") } } } ++++ # 🔐 sshphrase: генерация SSH-ключей по фразе ## 📋 Назначение `sshphrase.exe` — это автономная утилита для Windows, написанная на Go, предназначенная для генерации пары SSH-ключей (ED25519) на основе вводимой пользователем фразы. Программа не хранит ключи, не принимает аргументы и не требует доступа к сети. --- ## 🧠 Концепция - 🔑 **Фраза пользователя** используется как единственный секрет - 🧬 Генерация осуществляется через `SHA256(фраза)` → `ed25519.NewKeyFromSeed` - 🧾 Публичный ключ можно использовать в `~/.ssh/authorized_keys` - 🔒 Приватный ключ никогда не сохраняется автоматически - 📎 Программа безопасна к публикации: исходный код открыт, безопасность держится на фразе --- ## ⚙️ Использование 1. Запусти `sshphrase.exe` 2. Введи фразу вручную (ввод скрыт, вставка недоступна) 3. Выбери действие: - `1` — показать публичный ключ - `2` — показать приватный ключ (в OpenSSH формате) - `0` — выход Скопируй нужный ключ в буфер и используй при настройке SSH-доступа. --- ## 📦 Примеры вывода ### Публичный ключ ``` ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAILvY... пользователь@фраза ``` ### Приватный ключ (OpenSSH) ``` -----BEGIN OPENSSH PRIVATE KEY----- b3BlbnNzaC1rZXktZ...много base64 -----END OPENSSH PRIVATE KEY----- ``` --- ## 🛡️ Безопасность - Нет аргументов CLI → невозможен автоматический перебор фраз - Ввод фразы скрыт (`term.ReadPassword`) → безопасно от shoulder surfing - Можно вручную добавлять "соль": имя устройства, дату, и т.п. - Приватный ключ выводится только по запросу, без сохранения - `.exe` можно запускать с зашифрованной флешки --- ## 💡 Рекомендации - Используйте фразы длиной не менее 30 символов - Добавляйте уникальные метки (например, `::server_name::2025`) - Не храните приватный ключ, если не уверены в среде - Не используйте одинаковую фразу на разных устройствах — добавляйте контекст --- ## 📁 Разработка Программа написана на Go 1.20+ ### Сборка ``` go build -ldflags="-s -w" -o sshphrase.exe ``` ### Добавление иконки ``` rsrc -ico icon.ico ``` --- ## 🧱 Лицензия и открытость Исходный код открыт. Использование программы безопасно при соблюдении базовой цифровой гигиены. --- **Автор:** [takraztak] **Документация создана:** 2025-04-15