Maison > développement back-end > Golang > Créer un gestionnaire de mots de passe dans Go : partie 2

Créer un gestionnaire de mots de passe dans Go : partie 2

Barbara Streisand
Libérer: 2024-09-25 06:19:02
original
778 Les gens l'ont consulté

Bienvenue dans notre parcours de création d'un gestionnaire de mots de passe dans Go ! Dans ce deuxième volet, nous explorerons les progrès que nous avons réalisés depuis notre engagement initial. Nous avons ajouté de nouvelles fonctionnalités, amélioré la structure du code et implémenté des tests. Allons-y !

Faire évoluer la structure du projet

L'un des premiers changements que vous remarquerez est la structure améliorée du projet. Nous avons séparé notre code en plusieurs fichiers et packages, en suivant les meilleures pratiques de Go :

dost/
.
├── LICENSE
├── README.md
├── go.mod
├── go.sum
├── internal
│   ├── internal_test.go
│   └── passgen.go
└── main.go
Copier après la connexion

Cette structure permet une meilleure organisation et maintenabilité à mesure que notre projet se développe.

Interface de ligne de commande améliorée

Nous avons considérablement amélioré notre CLI, la rendant plus flexible et conviviale. Voici un extrait de notre main.go :

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

    switch os.Args[1] {
    case "generate":
        internal.Generate(generateCmd)
    }
}
Copier après la connexion

Cette configuration autorise les sous-commandes, prenant actuellement en charge la commande generate. Les utilisateurs peuvent désormais interagir avec notre outil comme ceci :

go run main.go generate email/reachme@example.com 15
Copier après la connexion

Génération de mot de passe personnalisable

Nous avons ajouté des options pour personnaliser la génération de mot de passe. Les utilisateurs peuvent désormais spécifier la longueur du mot de passe et choisir d'exclure les caractères spéciaux :

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)
}
Copier après la connexion

Cette fonction permet aux utilisateurs d'utiliser des indicateurs comme -n pour exclure les symboles et -c pour copier le mot de passe dans le presse-papiers au lieu de l'afficher.

Algorithme de génération de mot de passe amélioré

Nous avons affiné notre fonction de génération de mot de passe pour gérer les nouvelles options de personnalisation :

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 < length; i++ {
    // Generate a random index to select a character from allChars
    randomIndex, err := rand.Int(rand.Reader, big.NewInt(int64(len(allChars))))
    if err != nil {
        return "", err
    }

    // Append the randomly selected character to the password
    password += string(allChars[randomIndex.Int64()])
    }

    return password, nil
}
Copier après la connexion

Cette fonction respecte désormais le flag noSymbols, permettant une génération de mot de passe plus flexible.

Implémentation des tests

Nous avons franchi une étape importante pour garantir la fiabilité de notre code en mettant en œuvre des tests. Voici un extrait de notre fichier de test :

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 <= 10000; i++ {
        password, err := generatePassword(10, false)
        // ... (code to check for special characters)
    }
    if splCharMissing > 0 {
        t.Errorf("Special character was missing in %d / 10000 instances.", splCharMissing)
    }
}
Copier après la connexion

Ces tests vérifient la longueur correcte du mot de passe et l'inclusion de caractères spéciaux. Il est intéressant de noter que notre test des caractères spéciaux a révélé un point à améliorer : sur 10 000 mots de passe générés, 234 ne contenaient pas de caractères spéciaux. Cela nous donne une direction claire pour notre prochain raffinement.

Quelle est la prochaine étape ?

Bien que nous ayons réalisé des progrès significatifs, il reste encore place à l'amélioration :

  1. Affinez l'algorithme de génération de mot de passe pour garantir l'inclusion cohérente des caractères spéciaux.
  2. Implémentez la fonctionnalité de stockage des mots de passe.
  3. Ajoutez le cryptage pour les mots de passe stockés.
  4. Développer des fonctionnalités de recherche et de récupération.

Restez à l'écoute pour la prochaine partie de notre série, où nous relèverons ces défis et continuerons à faire évoluer notre gestionnaire de mots de passe !

N'oubliez pas que le code source complet est disponible sur GitHub. N'hésitez pas à cloner, bifurquer et contribuer au projet. Vos commentaires et contributions sont toujours les bienvenus !

Bon codage et restez en sécurité ! ??

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

gestionnaire de mots de passe en ligne de commande dost écrit en Go

dost

dost est un gestionnaire de mots de passe CLI écrit en Go.

Inspiré par (Pass)[https://www.passwordstore.org/]

Caractéristiques

  • Générer des mots de passe aléatoires de longueur configurable
  • Copier automatiquement les mots de passe générés dans le presse-papiers
  • Passer à l'aide de symboles

Utilisation

> go build -o dost main.go
Copier après la connexion
Entrez en mode plein écran Quitter le mode plein écran

Generating password:

> ./dost generate email/vema@example.com
Generated Password: );XE,7-Dv?)Aa+&<{V-|pKuq5
Copier après la connexion

Generating password with specified length (default is 25):

> ./dost generate email/vema@example.com 12
Generated Password: si<yJ=5/lEb3
Copier après la connexion

Copy generated password to clipboard without printing:

> ./dost generate -c email/vema@example.com 
Copied to clipboard! ✅
Copier après la connexion

Avoid symbols for generating passwords:

> ./dost generate -n email/vema@example.com 
Generated Password: E2UST}^{Ac[Fb&D|cD%;Eij>H
Copier après la connexion

Under development

  • Insert a new password manually
  • Show an existing password
  • List all entries
  • Password storage
  • GPG Key based encryption

License

MIT




View on GitHub


Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:dev.to
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal