Go에서 비밀번호 관리자 구축하기: 2부

Barbara Streisand
풀어 주다: 2024-09-25 06:19:02
원래의
627명이 탐색했습니다.

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(&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)
}
로그인 후 복사

이 기능을 사용하면 -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개에는 특수 문자가 포함되어 있지 않았습니다. 이는 우리의 다음 개선을 위한 명확한 방향을 제시합니다.

다음은 무엇입니까?

크게 진전을 이루었지만 여전히 개선의 여지가 있습니다.

  1. 일관되게 특수 문자가 포함되도록 비밀번호 생성 알고리즘을 개선합니다.
  2. 비밀번호 저장 기능을 구현하세요.
  3. 저장된 비밀번호에 암호화를 추가하세요.
  4. 검색 및 검색 기능을 개발하세요.

이러한 과제를 해결하고 비밀번호 관리자를 계속해서 발전시켜 나갈 시리즈의 다음 부분을 계속 지켜봐 주시기 바랍니다!

전체 소스 코드는 GitHub에서 확인할 수 있습니다. 자유롭게 프로젝트를 복제하고 포크하고 기여해 보세요. 여러분의 피드백과 기여는 언제나 환영입니다!

즐거운 코딩을 즐기시고 보안을 유지하세요! ??

Building a Password Manager in Go: Part 2 스베마라주 / 도스트

Go로 작성된 dost 명령줄 비밀번호 관리자

도스트

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
로그인 후 복사

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


위 내용은 Go에서 비밀번호 관리자 구축하기: 2부의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:dev.to
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!