Willkommen zurück auf unserer Reise zum Erstellen eines Passwort-Managers in Go! In dieser zweiten Folge werden wir die Fortschritte untersuchen, die wir seit unserem ersten Commit gemacht haben. Wir haben neue Funktionen hinzugefügt, die Codestruktur verbessert und Tests implementiert. Lasst uns eintauchen!
Eine der ersten Änderungen, die Sie bemerken werden, ist die verbesserte Projektstruktur. Wir haben unseren Code in mehrere Dateien und Pakete aufgeteilt und dabei die Best Practices von Go befolgt:
dost/ . ├── LICENSE ├── README.md ├── go.mod ├── go.sum ├── internal │ ├── internal_test.go │ └── passgen.go └── main.go
Diese Struktur ermöglicht eine bessere Organisation und Wartbarkeit, wenn unser Projekt wächst.
Wir haben unsere CLI erheblich verbessert und sie flexibler und benutzerfreundlicher gemacht. Hier ist ein Ausschnitt aus unserem main.go:
func main() { generateCmd := flag.NewFlagSet("generate", flag.ExitOnError) flag.Parse() switch os.Args[1] { case "generate": internal.Generate(generateCmd) } }
Dieses Setup ermöglicht Unterbefehle und unterstützt derzeit den Befehl „generate“. Benutzer können jetzt wie folgt mit unserem Tool interagieren:
go run main.go generate email/reachme@example.com 15
Wir haben Optionen zum Anpassen der Passwortgenerierung hinzugefügt. Benutzer können jetzt die Passwortlänge angeben und Sonderzeichen ausschließen:
func Generate(generateFlags *flag.FlagSet) { generateFlags.BoolVar(&noSymbols, "n", false, "Skip symbols while generating password") generateFlags.BoolVar(©ToClipBoard, "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) }
Mit dieser Funktion können Benutzer Flags wie -n zum Ausschließen von Symbolen und -c verwenden, um das Passwort in die Zwischenablage zu kopieren, anstatt es anzuzeigen.
Wir haben unsere Funktion zur Passwortgenerierung verfeinert, um die neuen Anpassungsoptionen zu berücksichtigen:
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 }
Diese Funktion berücksichtigt jetzt das noSymbols-Flag und ermöglicht so eine flexiblere Passwortgenerierung.
Wir haben durch die Implementierung von Tests einen wichtigen Schritt zur Sicherstellung der Zuverlässigkeit unseres Codes gemacht. Hier ist ein Ausschnitt aus unserer Testdatei:
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) } }
Diese Tests prüfen die korrekte Passwortlänge und die Einbeziehung von Sonderzeichen. Interessanterweise hat unser Sonderzeichentest einen Bereich mit Verbesserungspotenzial aufgedeckt: Von 10.000 generierten Passwörtern enthielten 234 keine Sonderzeichen. Dies gibt uns eine klare Richtung für unsere nächste Verfeinerung.
Obwohl wir erhebliche Fortschritte gemacht haben, gibt es noch Raum für Verbesserungen:
Bleiben Sie gespannt auf den nächsten Teil unserer Serie, in dem wir uns diesen Herausforderungen stellen und unseren Passwort-Manager weiterentwickeln!
Denken Sie daran, dass der vollständige Quellcode auf GitHub verfügbar ist. Fühlen Sie sich frei, das Projekt zu klonen, zu forken und dazu beizutragen. Ihr Feedback und Ihre Beiträge sind immer willkommen!
Viel Spaß beim Codieren und bleiben Sie sicher! ??
dost ist ein in Go geschriebener CLI-Passwort-Manager.
Inspiriert von (Pass)[https://www.passwordstore.org/]
> go build -o dost main.go
Generating password:
> ./dost generate email/vema@example.com Generated Password: );XE,7-Dv?)Aa+&<{V-|pKuq5
Generating password with specified length (default is 25):
> ./dost generate email/vema@example.com 12 Generated Password: si<yJ=5/lEb3
Copy generated password to clipboard without printing:
> ./dost generate -c email/vema@example.com Copied to clipboard! ✅
Avoid symbols for generating passwords:
> ./dost generate -n email/vema@example.com Generated Password: E2UST}^{Ac[Fb&D|cD%;Eij>H
MIT
Das obige ist der detaillierte Inhalt vonErstellen eines Passwort-Managers in Go: Teil 2. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!