【Go】密码生成器

package main

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

const (
	NUM  string = "0123456789"
	CHAR string = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
	SPEC string = "~!@#$%^&*?()<>,.;:"
)

var (
	length  int
	typeset string
)

func parseArgs() {
	flag.IntVar(&length, "l", 16, "指定密码长度")
	flag.StringVar(&typeset, "t", "char",
		`指定密码字符集
num: 数字集
char: 字母集
mix: 数字和字母集
advance: 数字和字母和特殊字符集`)
	flag.Parse()
}

func strJion(stragrs ...string) string {
	var str strings.Builder
	for _, v := range stragrs {
		str.WriteString(v)
	}
	newStr := str.String()
	return newStr
}

func generatePwd() string {
	var pwd []byte = make([]byte, length, length)
	var sourceSet string

	switch typeset {
	case "num":
		sourceSet = strJion(NUM)
	case "char":
		sourceSet = strJion(CHAR)
	case "mix":
		sourceSet = strJion(NUM, CHAR)
	case "advance":
		sourceSet = strJion(NUM, CHAR, SPEC)
	default:
		sourceSet = CHAR
	}

	//fmt.Printf("%v\n", sourceSet)

	for i := 0; i < length; i++ {
		pwd[i] = sourceSet[rand.Intn(len(sourceSet))]
	}
	return string(pwd)
}

func main() {
	rand.Seed(time.Now().UnixNano())
	parseArgs()
	//fmt.Printf("%d, %s\n", length, typeset)
	p := generatePwd()
	fmt.Println(p)
}

  

posted @ 2022-05-07 00:11  kunsile  阅读(83)  评论(0编辑  收藏  举报