13_Md5工具类及注册密码加密_哔哩哔哩_bilibili
Golang Md5的4种写法与源码简单分析 - 掘金 (juejin.cn)
(5 封私信 / 2 条消息) 随机盐值(salt)是什么?泄露会出什么问题? - 知乎 (zhihu.com)
本项目用的是md5加盐:基础pwd加密之后加随机盐再加密得到字串存到数据库。
单纯一次md5容易被彩虹表破解
package utils
import (
"crypto/md5"
"encoding/hex"
"fmt"
"strings"
)
// 小写
func Md5Encode(data string) string {
h := md5.New()
h.Write([]byte(data))
tempStr := h.Sum(nil)
return hex.EncodeToString(tempStr)
}
// 大写
func MD5Encode(data string) string {
return strings.ToUpper(Md5Encode(data))
}
// 加密 md5 + 随机数salt
func MakePassword(plainpwd, salt string) string {
return Md5Encode(plainpwd + salt)
}
// 解密 只是用用户输入的密码+盐再重新算一遍加密和数据库中存储的加密后代码比较,知道密码是否正确
func ValidPassword(plainpwd, salt string, password string) bool {
md := Md5Encode(plainpwd + salt)
fmt.Println(md + " " + password)
return md == password
}
验证的方式是将获取的用户输入的登用用户输入的密码+盐再重新算一遍加密和数据库中存储的加密后password进行比对,如果一致说明密码正确,因为md5的碰撞很小,默认是不同的密码加密不会出现一样的加密字符。