Инструменты пользователя

Инструменты сайта


projects:windows:ssh_phrase

Различия

Показаны различия между двумя версиями страницы.

Ссылка на это сравнение

Предыдущая версия справа и слеваПредыдущая версия
Следующая версия
Предыдущая версия
projects:windows:ssh_phrase [2025/04/15 18:28] projects:windows:ssh_phrase [2025/04/15 23:01] (текущий)
Строка 1: Строка 1:
 ====== SSH Phrase ====== ====== SSH Phrase ======
  
-**Данный код позволяет указывать фразу из которой будет сгенерирован ключ OpenSSH**\\+//**Простая и безопасная утилита для генерации пары SSH-ключей (ED25519) по фразе.\\ 
 +Не сохраняет ключи, не использует сеть и не принимает аргументы — всё работает через интерактивное меню.\\ 
 +Подходит для защищённого доступа с зашифрованной флешки и персонального использования.**//\\
  
-Исходный код:\\+**Программа в архиве:**\\ 
 +{{ :projects:windows:sshphrase.zip |}} (1.25 Mb) 
 + 
 + 
 +<WRAP center round important 90%> 
 +<code> 
 +в ssh приватном ключе вида 
 +-----BEGIN OPENSSH PRIVATE KEY----- 
 +b3BlbnNzaC1rZXktZ...много base64 
 +-----END OPENSSH PRIVATE KEY----- 
 +обязательно должен быть символ переноса на новую строку в конце файла, 
 +иначе будет ошибка при попытке подключения 
 +</code> 
 +</WRAP> 
 + 
 + 
 + 
 +**Исходный код:**
 ++++sshphrase.go| ++++sshphrase.go|
 <code go sshphrase.go> <code go sshphrase.go>
-// sshphrase.go+// sshphrase.go — генерация ED25519-ключей с использованием golang.org/x/crypto/ssh
 package main package main
  
Строка 22: Строка 41:
 ) )
  
-// ===== marshalOpenSSHPrivateKey: Сериализация приватного ключа в OpenSSH-формате ===== +type Pair struct { 
-func marshalOpenSSHPrivateKey(privateKey ed25519.PrivateKey) ([]byte, error) { + Private []byte 
- // Структура для OpenSSH-ключа + Public  []byte 
- type opensshPrivateKey struct { +}
- Check1 uint32 +
- Check2 uint32 +
- Key    struct { +
- Curve  string +
- PubKey []byte +
- Priv   []byte +
- } +
- }+
  
- pub := privateKey.Public().(ed25519.PublicKey+func PairFromED25519(public ed25519.PublicKey, private ed25519.PrivateKey) (*Pairerror{ 
- buf := &bytes.Buffer{} + privBlock, err := ssh.MarshalPrivateKey(private, ""
- buf.Write([]byte("openssh-key-v1\x00")+ if err != nil { 
- writeString(buf"none") // cipher name (без шифрования+ return nilerr 
- writeString(buf, "none") // kdf name (без ключевого деривационного алгоритма+ }
- writeString(buf""    // kdf options (пусто) +
- writeUint32(buf, 1)      // количество ключей+
  
- pubKey, err :ssh.NewPublicKey(pub)+ var buf bytes.Buffer 
 + err = pem.Encode(&buf, privBlock)
  if err != nil {  if err != nil {
  return nil, err  return nil, err
  }  }
- writeString(buf, string(ssh.MarshalAuthorizedKey(pubKey))) 
  
- content := &bytes.Buffer{} + pubKey, err := ssh.NewPublicKey(public
- check := uint32(0x01020304) // контрольное значение для валидации + if err !nil 
- writeUint32(content, check) + return nil, err
- writeUint32(content, check) +
- writeString(content, "ssh-ed25519"+
- writeString(content, string(pub)) +
- writeString(content, string(privateKey)) +
- content.WriteByte(0// завершающий ноль +
- +
- padLen :8 - (content.Len() % 8) +
- for i := 1; i <= padLen; i++ +
- content.WriteByte(byte(i))+
  }  }
- writeString(buf, content.String()) 
  
- final := pem.EncodeToMemory(&pem.Block+ return &Pair
- Type "OPENSSH PRIVATE KEY"+ Privatebuf.Bytes()
- Bytesbuf.Bytes(), + Public ssh.MarshalAuthorizedKey(pubKey), 
- }+ }, nil
- return final, nil+
 } }
  
-// ===== Конец marshalOpenSSHPrivateKey ===== 
- 
-func writeString(w *bytes.Buffer, s string) { 
- writeUint32(w, uint32(len(s))) 
- w.WriteString(s) 
-} 
- 
-func writeUint32(w *bytes.Buffer, v uint32) { 
- w.WriteByte(byte(v >> 24)) 
- w.WriteByte(byte(v >> 16)) 
- w.WriteByte(byte(v >> 8)) 
- w.WriteByte(byte(v)) 
-} 
- 
-// ===== main: CLI-меню, генерация ключей по введённой фразе ===== 
 func main() { func main() {
  fmt.Print("Введите фразу: ")  fmt.Print("Введите фразу: ")
Строка 95: Строка 78:
  phrase := string(b)  phrase := string(b)
  
- // Создание seed на основе хэша введённой фразы 
  seed := sha256.Sum256([]byte(phrase))  seed := sha256.Sum256([]byte(phrase))
  privateKey := ed25519.NewKeyFromSeed(seed[:])  privateKey := ed25519.NewKeyFromSeed(seed[:])
- publicKey, err := ssh.NewPublicKey(privateKey.Public())+ publicKey := privateKey.Public().(ed25519.PublicKey) 
 + 
 + pair, err := PairFromED25519(publicKey, privateKey)
  if err != nil {  if err != nil {
- log.Fatalf("Ошибка создания публичного ключа: %v", err)+ log.Fatalf("Ошибка генерации ключей: %v", err)
  }  }
  
Строка 116: Строка 100:
  case "1":  case "1":
  fmt.Println("\n📤 Публичный ключ (копируй в authorized_keys):")  fmt.Println("\n📤 Публичный ключ (копируй в authorized_keys):")
- fmt.Println(string(ssh.MarshalAuthorizedKey(publicKey)))+ fmt.Println(string(pair.Public))
  
  case "2":  case "2":
  fmt.Println("\n🔐 Приватный ключ (в формате OpenSSH):")  fmt.Println("\n🔐 Приватный ключ (в формате OpenSSH):")
- keyBytes, err := marshalOpenSSHPrivateKey(privateKey) + fmt.Println(string(pair.Private))
- if err != nil { +
- log.Fatalf("Ошибка сериализации приватного ключа: %v", err) +
-+
- fmt.Println(string(keyBytes))+
  fmt.Println("(Сохрани как id_ed25519 и установи chmod 600)")  fmt.Println("(Сохрани как id_ed25519 и установи chmod 600)")
  
Строка 137: Строка 117:
 } }
  
-// ===== Конец main =====+</code> 
 +++++
  
 +<code bash README.md>
 +# 🔐 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
 </code> </code>
-+++++ 
projects/windows/ssh_phrase.1744730929.txt.gz · Последнее изменение: 2025/04/15 18:28 —

Если не указано иное, содержимое этой вики предоставляется на условиях следующей лицензии: CC Attribution 4.0 International
CC Attribution 4.0 International Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki