package hash import ( "crypto/md5" "crypto/rand" "encoding/hex" ) // GenerateSalt 生成随机盐(16字节 hex = 32字符) func GenerateSalt() string { b := make([]byte, 16) rand.Read(b) return hex.EncodeToString(b) } // Password 用盐+MD5加密密码,返回 salt 和 hash func Password(pwd string) (salt string, hash string) { salt = GenerateSalt() hash = MD5Salt(pwd, salt) return } // MD5Salt 用指定盐计算 MD5:md5(salt + password) func MD5Salt(pwd, salt string) string { h := md5.New() h.Write([]byte(salt + pwd)) return hex.EncodeToString(h.Sum(nil)) } // Verify 验证密码:用存储的盐重新计算 MD5 比对 func Verify(storedHash, salt, pwd string) bool { if salt == "" || storedHash == "" { return false } return MD5Salt(pwd, salt) == storedHash }