====== 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