使用go生成一个md5校验工具

package main

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

/*
用户输入对应的指
-s 字符串计算hash --》 自动随机的salt ==>结果输出(salt + hash)
-c check 检测密码 -s 密码原文  -hash 成功,失败

*/
func init() {
	rand.Seed(time.Now().Unix())
}

var (
	check bool
	text  string
	hash  string
	salt  string
	help  bool
	h     bool
)

const saltLength = 6

//检查密码
func CheckPassword(text, hash string) bool {

	//如果存在大于-1
	pointerIndex := strings.LastIndex(hash, "##")
	if pointerIndex < 0 {
		return false
	}

	return HashPassword(text, hash[:pointerIndex]) == hash
}

//生成salt
func GeneratePassword() string {
	saltstring := "asadsnknwwoeiwieeojfnddchsudhiadeqwepoweooi324i8385850188099@#%!"

	data := make([]byte, saltLength)

	for i := 0; i < saltLength; i++ {
		data[i] = saltstring[rand.Intn(len(saltstring))]
	}
	return string(data)
}

func Md5Text(text string) string {

	return fmt.Sprintf("%x", md5.Sum([]byte(text)))
}

//hashpassword
func HashPassword(text string, salt string) string {
	//salt$$hash
	if salt == "" {
		salt := GeneratePassword()
		hash := Md5Text(fmt.Sprintf("%s:%s", salt, text))
		return fmt.Sprintf("%s##%s", salt, hash)

	}

	hash := Md5Text(fmt.Sprintf("%s:%s", salt, text))
	return fmt.Sprintf("%s##%s", salt, hash)

}
func main() {
	flag.BoolVar(&h, "h", false, "help info")
	flag.BoolVar(&help, "help", false, "help info")
	flag.BoolVar(&check, "c", false, "check password")
	flag.StringVar(&text, "s", "", "input password text")
	flag.StringVar(&hash, "hash", "", "password hash")
	flag.StringVar(&salt, "salt", "", "input salt")

	flag.Usage = func() {
		fmt.Println("password [-c] [-s password] [-hash hash password]")
		flag.PrintDefaults()
	}

	flag.Parse()

	if h || help {
		flag.Usage()
		return
	}

	if check {
		if ok := CheckPassword(text, hash); ok {
			fmt.Println("password check successful")
		} else {
			fmt.Println("password check failure")
		}
	} else {
		fmt.Println(text)
		fmt.Println(HashPassword(text, salt))
	}
}

posted @ 2022-02-02 09:56  wangsk  阅读(245)  评论(0)    收藏  举报