首頁 > 後端開發 > Golang > 在 Go 中建立密碼管理器:第 2 部分

在 Go 中建立密碼管理器:第 2 部分

Barbara Streisand
發布: 2024-09-25 06:19:02
原創
776 人瀏覽過

歡迎回到我們用 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(&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 密碼管理器。

靈感來自(通行證)[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
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板