«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > Создание менеджера паролей в Go: часть 2

Создание менеджера паролей в Go: часть 2

Опубликовано 1 ноября 2024 г.
Просматривать:810

Добро пожаловать обратно в наше путешествие по созданию менеджера паролей на Go! Во второй части мы рассмотрим прогресс, которого мы достигли с момента нашего первоначального коммита. Мы добавили новые функции, улучшили структуру кода и реализовали тестирование. Давайте погрузимся!

Развитие структуры проекта

Одним из первых изменений, которые вы заметите, является улучшенная структура проекта. Мы разделили наш код на несколько файлов и пакетов, следуя лучшим практикам Go:

dost/
.
├── LICENSE
├── README.md
├── go.mod
├── go.sum
├── internal
│   ├── internal_test.go
│   └── passgen.go
└── main.go

Эта структура позволяет улучшить организацию и удобство обслуживания по мере роста нашего проекта.

Улучшенный интерфейс командной строки

Мы значительно улучшили наш интерфейс командной строки, сделав его более гибким и удобным для пользователя. Вот фрагмент нашего main.go:

func main() {
    generateCmd := flag.NewFlagSet("generate", flag.ExitOnError)
    flag.Parse()

    switch os.Args[1] {
    case "generate":
        internal.Generate(generateCmd)
    }
}

Эта настройка позволяет использовать подкоманды, в настоящее время поддерживающие команду генерации. Теперь пользователи могут взаимодействовать с нашим инструментом следующим образом:

go run main.go generate email/[email protected] 15

Настраиваемая генерация паролей

Мы добавили опции для настройки генерации паролей. Теперь пользователи могут указывать длину пароля и исключать специальные символы:

func Generate(generateFlags *flag.FlagSet) {
    generateFlags.BoolVar(&noSymbols, "n", false, "Skip symbols while generating password")
    generateFlags.BoolVar(&copyToClipBoard, "c", false, "Copy to clipboard.")
    generateFlags.Parse(os.Args[2:])
    passwordLength := 25
    // ... (code to parse custom length)

    password, err := generatePassword(passwordLength, noSymbols)
    // ... (code to handle password output)
}

Эта функция позволяет пользователям использовать такие флаги, как -n для исключения символов и -c для копирования пароля в буфер обмена вместо его отображения.

Улучшенный алгоритм генерации пароля

Мы усовершенствовали нашу функцию генерации паролей для поддержки новых параметров настройки:

func generatePassword(length int, noSymbols bool) (string, error) {
    const (
        uppercaseLetters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
        lowercaseLetters = "abcdefghijklmnopqrstuvwxyz"
        digits           = "0123456789"
        specialChars     = "!@#$%^&*()-_= []{}|;:'\",./?"
    )

    allChars := uppercaseLetters   lowercaseLetters   digits
    if !noSymbols {
        allChars  = specialChars
    }

    var password string
    for i := 0; i 


Эта функция теперь учитывает флаг noSymbols, что позволяет более гибко генерировать пароли.

Реализация тестов

Мы сделали значительный шаг к обеспечению надежности нашего кода, внедрив тесты. Вот фрагмент нашего тестового файла:

func TestPasswordLength(t *testing.T) {
    password, err := generatePassword(10, true)
    if err != nil {
        t.Errorf("Expected no error, got %v", err)
    } else {
        if len(password) != 10 {
            t.Errorf("Expected 10 character password, got %d", len(password))
        }
    }
}

func TestSpecialCharacter10K(t *testing.T) {
    splCharMissing := 0
    for i := 1; i  0 {
        t.Errorf("Special character was missing in %d / 10000 instances.", splCharMissing)
    }
}

Эти тесты проверяют правильную длину пароля и наличие специальных символов. Интересно, что наш тест специальных символов выявил области для улучшения: из 10 000 сгенерированных паролей 234 не содержали специальных символов. Это дает нам четкое направление для нашей следующей доработки.

Что дальше?

Несмотря на значительный прогресс, нам еще есть куда совершенствоваться:

  1. Уточнить алгоритм генерации пароля, чтобы обеспечить постоянное включение специальных символов.
  2. Реализовать функцию хранения паролей.
  3. Добавьте шифрование для сохраненных паролей.
  4. Разработать функции поиска и извлечения данных.

Следите за обновлениями в следующей части нашей серии, где мы решим эти проблемы и продолжим развивать наш менеджер паролей!

Помните, что полный исходный код доступен на GitHub. Не стесняйтесь клонировать, разветвлять и вносить свой вклад в проект. Ваши отзывы и вклад всегда приветствуются!

Удачного программирования и будьте в безопасности! ??

Building a Password Manager in Go: Part 2 Свемараджу / дост

менеджер паролей командной строки dost, написанный на Go

дост

dost — это менеджер паролей CLI, написанный на Go.

На основе (Pass)[https://www.passwordstore.org/]

Функции

  • Создание случайных паролей настраиваемой длины
  • Автоматическое копирование сгенерированных паролей в буфер обмена
  • Пропустить использование символов

Использование

> go build -o dost main.go
Перейти в полноэкранный режимВыйти из полноэкранного режима

Генерация пароля:

> ./dost generate email/[email protected]
Generated Password: );XE,7-Dv?)Aa &

Генерация пароля указанной длины (по умолчанию 25):

> ./dost generate email/[email protected] 12
Generated Password: si

Скопировать сгенерированный пароль в буфер обмена, не распечатывая:

> ./dost generate -c email/[email protected] 
Copied to clipboard! ✅

Избегайте символов для создания паролей:

> ./dost generate -n email/[email protected] 
Generated Password: E2UST}^{Ac[Fb&D|cD%;Eij>H

В разработке

  • Введите новый пароль вручную
  • Показать существующий пароль
  • Показать все записи
  • Хранение пароля
  • Шифрование на основе ключа GPG

Лицензия

МТИ




Просмотреть на GitHub


Заявление о выпуске Эта статья воспроизведена по адресу: https://dev.to/svemaraju/building-a-password-manager-in-go-part-2-5adf?1 Если есть какие-либо нарушения, свяжитесь с [email protected], чтобы удалить это
Последний учебник Более>

Изучайте китайский

Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.

Copyright© 2022 湘ICP备2022001581号-3