Go でパスワード マネージャーを構築する旅へようこそ!この 2 回目の記事では、最初のコミット以降の進捗状況を見ていきます。新しい機能を追加し、コード構造を改善し、テストを実装しました。飛び込んでみましょう!
最初に気づく変更の 1 つは、プロジェクト構造の改善です。 Go のベスト プラクティスに従って、コードを複数のファイルとパッケージに分割しました。
dost/ . ├── LICENSE ├── README.md ├── go.mod ├── go.sum ├── internal │ ├── internal_test.go │ └── passgen.go └── main.go
この構造により、プロジェクトが成長するにつれて組織化と保守性が向上します。
CLI が大幅に改善され、より柔軟でユーザーフレンドリーになりました。以下は main.go のスニペットです:
func main() { generateCmd := flag.NewFlagSet("generate", flag.ExitOnError) flag.Parse() switch os.Args[1] { case "generate": internal.Generate(generateCmd) } }
このセットアップではサブコマンドが可能になり、現在はgenerateコマンドをサポートしています。ユーザーは次のようにツールを操作できるようになりました:
go run main.go generate email/reachme@example.com 15
パスワード生成をカスタマイズするオプションを追加しました。ユーザーはパスワードの長さを指定し、特殊文字を除外することを選択できるようになりました:
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) }
この機能を使用すると、ユーザーは -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 < 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 }
この関数は 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 <= 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) } }
これらのテストは、正しいパスワードの長さと特殊文字が含まれているかどうかをチェックします。興味深いことに、特殊文字テストでは改善の余地があることが明らかになりました。生成された 10,000 個のパスワードのうち、234 個に特殊文字が含まれていませんでした。これにより、次の改良のための明確な方向性が得られます。
私たちは大幅な進歩を遂げましたが、まだ改善の余地があります:
シリーズの次のパートにご期待ください。そこでは、これらの課題に取り組み、パスワード マネージャーを進化させ続けます。
完全なソース コードは GitHub で入手できることを覚えておいてください。自由にクローン、フォーク、プロジェクトに貢献してください。フィードバックや貢献はいつでも大歓迎です!
コーディングを楽しんで、安全を確保してください! ??
dost は Go で書かれた CLI パスワード マネージャーです。
(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
以上がGo でのパスワード マネージャーの構築: パート 2の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。