Abel'Blog

我干了什么?究竟拿了时间换了什么?

0%

go-推荐库

记录一些比较好的库,到时候可以方便使用。

管理后台

go-vue-admin

awesome-go

awesome-go

go-trending
你可以使用以下Go语言函数来生成包含8个字符的随机密码,确保每个字符类型(小写字母、大写字母、数字和特殊字符)至少出现一次:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
package main

import (
"crypto/rand"
"fmt"
)

func generatePassword() (string, error) {
lowercase := "abcdefghijklmnopqrstuvwxyz"
uppercase := "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
digits := "0123456789"
specialChars := "!@#$%^&*()"
allChars := lowercase + uppercase + digits + specialChars

// Ensure at least one character from each category is included
password := make([]byte, 8)
categories := []string{lowercase, uppercase, digits, specialChars}
for i, category := range categories {
char, err := getRandomChar(category)
if err != nil {
return "", err
}
password[i] = char
}

// Fill the remaining positions with random characters from all categories
for i := 4; i < 8; i++ {
char, err := getRandomChar(allChars)
if err != nil {
return "", err
}
password[i] = char
}

// Shuffle the password to prevent predictable placement
shuffledPassword, err := shuffle(password)
if err != nil {
return "", err
}

return string(shuffledPassword), nil
}

func getRandomChar(s string) (byte, error) {
b := make([]byte, 1)
_, err := rand.Read(b)
if err != nil {
return 0, err
}
index := int(b[0]) % len(s)
return s[index], nil
}

func shuffle(b []byte) ([]byte, error) {
shuffled := make([]byte, len(b))
perm, err := rand.Perm(len(b))
if err != nil {
return nil, err
}
for i, v := range perm {
shuffled[v] = b[i]
}
return shuffled, nil
}

func main() {
password, err := generatePassword()
if err != nil {
fmt.Println("Error generating password:", err)
return
}
fmt.Println("Generated Password:", password)
}

这个程序分几个步骤:

  1. 从每个字符类别(小写、大写、数字、特殊字符)中随机选择一个字符。
  2. 填充密码的剩余部分。
  3. 使用随机索引对密码字符进行混排,确保密码的随机性。
  4. 使用标准的crypto/rand库来生成安全的随机数,确保密码的强度和随机性。

运行此程序将生成一个包含至少每种类型字符的8位密码。