package libs import ( "crypto/md5" "crypto/sha256" "encoding/hex" "fmt" "strings" "github.com/gogf/gf/v2/util/grand" ) // Md5 计算MD5哈希(仅用于向后兼容旧密码验证) func Md5(buf []byte) string { return fmt.Sprintf("%x", md5.Sum(buf)) } // HashPassword 生成密码哈希(使用 SHA-256 + 随机盐值) // 格式: $sha256$$ func HashPassword(password string) (string, string) { salt := grand.S(16) h := sha256.Sum256([]byte(salt + password)) hash := fmt.Sprintf("$sha256$%s$%x", salt, h) return hash, salt } // VerifyPassword 验证密码,兼容新旧两种哈希格式 func VerifyPassword(password, storedHash, salt string) bool { // 新格式: $sha256$$ if strings.HasPrefix(storedHash, "$sha256$") { parts := strings.Split(storedHash, "$") if len(parts) != 4 { return false } h := sha256.Sum256([]byte(parts[2] + password)) expected := fmt.Sprintf("$sha256$%s$%x", parts[2], h) return storedHash == expected } // 旧格式: MD5(password + salt) return Md5([]byte(password+salt)) == storedHash } // Password 生成密码和盐值(已弃用,使用 HashPassword 代替) func Password(length int, pwdO string) (pwd string, salt string) { if pwdO == "" { pwdO = "george518" } pwd, salt = HashPassword(pwdO) return } // Sha256Hex 计算 SHA-256 十六进制字符串 func Sha256Hex(data []byte) string { h := sha256.Sum256(data) return hex.EncodeToString(h[:]) }