"Se um trabalhador quiser fazer bem o seu trabalho, ele deve primeiro afiar suas ferramentas." - Confúcio, "Os Analectos de Confúcio. Lu Linggong"
Primeira página > Programação > Construindo um gerenciador de senhas em Go: Parte 2

Construindo um gerenciador de senhas em Go: Parte 2

Publicado em 01/11/2024
Navegar:906

Bem-vindo de volta à nossa jornada de construção de um gerenciador de senhas no Go! Nesta segunda parte, exploraremos o progresso que fizemos desde o nosso compromisso inicial. Adicionamos novos recursos, melhoramos a estrutura do código e implementamos testes. Vamos mergulhar!

Evoluindo a Estrutura do Projeto

Uma das primeiras mudanças que você notará é a melhoria na estrutura do projeto. Separamos nosso código em vários arquivos e pacotes, seguindo as práticas recomendadas do Go:

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

Essa estrutura permite melhor organização e manutenção à medida que nosso projeto cresce.

Interface de linha de comando aprimorada

Melhoramos significativamente nossa CLI, tornando-a mais flexível e fácil de usar. Aqui está um trecho do nosso main.go:

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

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

Esta configuração permite subcomandos, atualmente suportando o comando generate. Os usuários agora podem interagir com nossa ferramenta assim:

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

Geração de senha personalizável

Adicionamos opções para personalizar a geração de senha. Os usuários agora podem especificar o comprimento da senha e optar por excluir caracteres especiais:

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)
}

Esta função permite que os usuários usem sinalizadores como -n para excluir símbolos e -c para copiar a senha para a área de transferência em vez de exibi-la.

Algoritmo de geração de senha aprimorado

Refinamos nossa função de geração de senha para lidar com as novas opções de personalização:

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 


Esta função agora respeita o sinalizador noSymbols, permitindo uma geração de senha mais flexível.

Implementando Testes

Demos um passo significativo para garantir a confiabilidade do nosso código através da implementação de testes. Aqui está um trecho do nosso arquivo de teste:

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)
    }
}

Esses testes verificam o comprimento correto da senha e a inclusão de caracteres especiais. Curiosamente, nosso teste de caracteres especiais revelou uma área que precisa ser melhorada: em 10.000 senhas geradas, 234 não continham caracteres especiais. Isso nos dá uma direção clara para nosso próximo refinamento.

O que vem a seguir?

Embora tenhamos feito progressos significativos, ainda há espaço para melhorias:

  1. Refine o algoritmo de geração de senha para garantir a inclusão consistente de caracteres especiais.
  2. Implemente a funcionalidade de armazenamento de senhas.
  3. Adicione criptografia para senhas armazenadas.
  4. Desenvolva recursos de pesquisa e recuperação.

Fique ligado na próxima parte da nossa série, onde enfrentaremos esses desafios e continuaremos a evoluir nosso gerenciador de senhas!

Lembre-se, o código-fonte completo está disponível no GitHub. Sinta-se à vontade para clonar, bifurcar e contribuir com o projeto. Seus comentários e contribuições são sempre bem-vindos!

Boa codificação e fique seguro! ??

Building a Password Manager in Go: Part 2 svemaraju / dost

gerenciador de senhas de linha de comando dost escrito em Go

dost

dost é um gerenciador de senhas CLI escrito em Go.

Inspirado por (Passe)[https://www.passwordstore.org/]

Características

  • Gere senhas aleatórias de tamanho configurável
  • Copiar senhas geradas para a área de transferência automaticamente
  • Ignorar o uso de símbolos

Uso

> go build -o dost main.go
Entrar no modo de tela cheia Sair do modo de tela cheia

Gerando senha:

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

Gerando senha com comprimento especificado (o padrão é 25):

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

Copiar a senha gerada para a área de transferência sem imprimir:

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

Evite símbolos para geração de senhas:

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

Em desenvolvimento

  • Insira uma nova senha manualmente
  • Mostrar uma senha existente
  • Listar todas as entradas
  • Armazenamento de senha
  • Criptografia baseada em chave GPG

Licença

MIT




Ver no GitHub


Declaração de lançamento Este artigo foi reproduzido em: https://dev.to/svemaraju/building-a-password-manager-in-go-part-2-5adf?1 Se houver alguma violação, entre em contato com [email protected] para excluir isto
Tutorial mais recente Mais>

Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.

Copyright© 2022 湘ICP备2022001581号-3