Go でのパスワード マネージャーの構築: パート 2

Barbara Streisand
リリース: 2024-09-25 06:19:02
オリジナル
626 人が閲覧しました

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(&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 中国語 Web サイトの他の関連記事を参照してください。

ソース:dev.to
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!