目录

GO语言开发实践-生成随机复杂度密码

根据我们自身需要,生成指定字符,指定长度的随机复杂度密码。

起源

在某个场景下,我们需要批量对 ECS 做一个定期更换密码的操作,密码启用了复杂度验证,需要 数字 + 小写字母 + 大写字母 + 特俗字符 的组合。找了网上一些随机生成密码的文章,有个第三方库 go-password ,但是不能实现特殊字符的自定义,因为有些特俗字符是不能用来做密码的。所以我们手动实现一个随机生成密码的程序。

编码

 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
74
75
76
package main

import (
    "fmt"
    "math/rand"
    "strings"
    "time"
)

const (
    lowerCharSet   = "abcdedfghijklmnopqrst"
    upperCharSet   = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
    specialCharSet = "!@#&*"
    numberSet      = "0123456789"
    allCharSet     = lowerCharSet + upperCharSet + specialCharSet + numberSet
)

func main() {
    // 如果是go 1.20 ,已经弃用 rand.Seed 
    rand.Seed(time.Now().Unix())
    minSpecialChar := 1
    minNum := 1
    minLowerCase := 1
    minUpperCase := 1
    passwordLength := 8
    password := generatePassword(passwordLength, minSpecialChar, minNum, minLowerCase, minUpperCase)
    fmt.Println(password)

    minSpecialChar = 2
    minNum = 2
    minUpperCase = 2
    passwordLength = 20
    password = generatePassword(passwordLength, minSpecialChar, minNum, minUpperCase)
    fmt.Println(password)
}

// 密码长度,最小特殊字符、数字、小写字母、大写字母的长度
func generatePassword(passwordLength, minSpecialChar, minNum, minLowerCase, minUpperCase int) string {
    var password strings.Builder

    //Set special character
    for i := 0; i < minSpecialChar; i++ {
        random := rand.Intn(len(specialCharSet))
        password.WriteString(string(specialCharSet[random]))
    }

    //Set numeric
    for i := 0; i < minNum; i++ {
        random := rand.Intn(len(numberSet))
        password.WriteString(string(numberSet[random]))
    }

    //Set uppercase
    for i := 0; i < minUpperCase; i++ {
        random := rand.Intn(len(upperCharSet))
        password.WriteString(string(upperCharSet[random]))
    }

    //Set lowercase
    for i := 0; i < minLowerCase; i++ {
      random := rand.Intn(len(lowerCharSet))
      password.WriteString(string(lowerCharSet[random]))
    }

    remainingLength := passwordLength - minSpecialChar - minNum - minUpperCase
    for i := 0; i < remainingLength; i++ {
        random := rand.Intn(len(allCharSet))
        password.WriteString(string(allCharSet[random]))
    }
    // 转化为 utf8 格式的数组,将数组随机打乱
    inRune := []rune(password.String())
        rand.Shuffle(len(inRune), func(i, j int) {
        inRune[i], inRune[j] = inRune[j], inRune[i]
    })
    return string(inRune)
}

结束

这样我们就完成了随机生成密码的一段程序,调用它来生成随机密码。