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) } }
이 설정에서는 현재 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!