歡迎回到我們用 Go 建立密碼管理器的旅程!在第二部分中,我們將探討自初次提交以來我們所取得的進展。我們添加了新功能,改進了程式碼結構並實施了測試。讓我們潛入吧!
您會注意到的第一個變化是改進的專案結構。我們遵循 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) } }
此設定允許使用子命令,目前支援產生命令。使用者現在可以像這樣與我們的工具互動:
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 密碼管理器。
靈感來自(通行證)[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中文網其他相關文章!