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))
}
}