Membina Pengurus Kata Laluan dalam Go: Bahagian 2

Barbara Streisand
Lepaskan: 2024-09-25 06:19:02
asal
737 orang telah melayarinya

Selamat datang kembali ke perjalanan kami membina pengurus kata laluan dalam Go! Dalam ansuran kedua ini, kami akan meneroka kemajuan yang telah kami buat sejak komitmen awal kami. Kami telah menambah ciri baharu, menambah baik struktur kod dan melaksanakan ujian. Jom terjun!

Membangunkan Struktur Projek

Salah satu perubahan pertama yang anda akan perhatikan ialah struktur projek yang dipertingkatkan. Kami telah mengasingkan kod kami kepada berbilang fail dan pakej, mengikut amalan terbaik Go:

dost/
.
├── LICENSE
├── README.md
├── go.mod
├── go.sum
├── internal
│   ├── internal_test.go
│   └── passgen.go
└── main.go
Salin selepas log masuk

Struktur ini membolehkan organisasi dan kebolehselenggaraan yang lebih baik semasa projek kami berkembang.

Antara Muka Baris Perintah Dipertingkat

Kami telah meningkatkan CLI kami dengan ketara, menjadikannya lebih fleksibel dan mesra pengguna. Berikut ialah coretan daripada main.go kami:

func main() {
    generateCmd := flag.NewFlagSet("generate", flag.ExitOnError)
    flag.Parse()

    switch os.Args[1] {
    case "generate":
        internal.Generate(generateCmd)
    }
}
Salin selepas log masuk

Persediaan ini membenarkan subperintah, yang kini menyokong perintah jana. Pengguna kini boleh berinteraksi dengan alat kami seperti ini:

go run main.go generate email/reachme@example.com 15
Salin selepas log masuk

Penjanaan Kata Laluan yang boleh disesuaikan

Kami telah menambah pilihan untuk menyesuaikan penjanaan kata laluan. Pengguna kini boleh menentukan panjang kata laluan dan memilih untuk mengecualikan aksara khas:

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)
}
Salin selepas log masuk

Fungsi ini membolehkan pengguna menggunakan bendera seperti -n untuk mengecualikan simbol dan -c untuk menyalin kata laluan ke papan keratan dan bukannya memaparkannya.

Algoritma Penjanaan Kata Laluan yang Diperbaiki

Kami telah memperhalusi fungsi penjanaan kata laluan kami untuk mengendalikan pilihan penyesuaian baharu:

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
}
Salin selepas log masuk

Fungsi ini kini menghormati bendera noSymbols, membolehkan penjanaan kata laluan yang lebih fleksibel.

Melaksanakan Ujian

Kami telah mengambil langkah penting ke arah memastikan kebolehpercayaan kod kami dengan melaksanakan ujian. Berikut ialah coretan daripada fail ujian kami:

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)
    }
}
Salin selepas log masuk

Ujian ini menyemak panjang kata laluan yang betul dan kemasukan aksara khas. Menariknya, ujian aksara khas kami mendedahkan kawasan untuk penambahbaikan: dalam 10,000 kata laluan yang dijana, 234 tidak mengandungi aksara khas. Ini memberi kita hala tuju yang jelas untuk pemurnian seterusnya.

Apa Seterusnya?

Walaupun kami telah mencapai kemajuan yang ketara, masih ada ruang untuk penambahbaikan:

  1. Perhalusi algoritma penjanaan kata laluan untuk memastikan kemasukan aksara khas yang konsisten.
  2. Laksanakan fungsi storan kata laluan.
  3. Tambahkan penyulitan untuk kata laluan yang disimpan.
  4. Membangunkan ciri carian dan dapatkan semula.

Nantikan bahagian seterusnya siri kami, di mana kami akan menangani cabaran ini dan terus mengembangkan pengurus kata laluan kami!

Ingat, kod sumber penuh tersedia di GitHub. Jangan ragu untuk mengklon, membuat garpu dan menyumbang kepada projek itu. Maklum balas dan sumbangan anda sentiasa dialu-alukan!

Selamat pengekodan, dan kekal selamat! ??

Building a Password Manager in Go: Part 2 svemaraju / dost

pengurus kata laluan baris arahan dost ditulis dalam Go

selesai

dost ialah pengurus kata laluan CLI yang ditulis dalam Go.

Diinspirasikan oleh (Pass)[https://www.passwordstore.org/]

Ciri

  • Jana kata laluan rawak dengan panjang boleh dikonfigurasikan
  • Salin kata laluan yang dijana ke papan keratan secara automatik
  • Langkau menggunakan simbol

Penggunaan

> go build -o dost main.go
Salin selepas log masuk
Masukkan mod skrin penuh Keluar daripada mod skrin penuh

Generating password:

> ./dost generate email/vema@example.com
Generated Password: );XE,7-Dv?)Aa+&<{V-|pKuq5
Salin selepas log masuk

Generating password with specified length (default is 25):

> ./dost generate email/vema@example.com 12
Generated Password: si<yJ=5/lEb3
Salin selepas log masuk

Copy generated password to clipboard without printing:

> ./dost generate -c email/vema@example.com 
Copied to clipboard! ✅
Salin selepas log masuk

Avoid symbols for generating passwords:

> ./dost generate -n email/vema@example.com 
Generated Password: E2UST}^{Ac[Fb&D|cD%;Eij>H
Salin selepas log masuk

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


Atas ialah kandungan terperinci Membina Pengurus Kata Laluan dalam Go: Bahagian 2. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:dev.to
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!