Golang如何从字符串切片创建哈希
Golang如何从字符串切片创建哈希 大家好!我又回来了!现在遇到了一个非常棘手的问题。我有以下代码:
func Login(w http.ResponseWriter, r *http.Request) {
r.ParseForm()
mysql_login(r.Form["username"], r.Form["password"])
}
func mysql_login(username []string, password []string) bool {
h := sha256.New()
h.Write([]byte(password))
hash := h.Sum(nil)
err := mysqlconnection.QueryRow("SELECT username,password FROM users where username = ?", 2).Scan(&username, &password)
if err != nil {
panic(err.Error())
return false
} else {
return true
}
}
我正在尝试从密码字符串切片创建sha256哈希,但是无法正常工作。 我收到这个错误:
cannot convert password (type []string) to type []byte
有没有什么方法可以创建这个哈希?
更多关于Golang如何从字符串切片创建哈希的实战教程也可以访问 https://www.itying.com/category-94-b0.html
3 回复
我有一个修复方法。 只需将
r.Form["password"]
替换为
r.FormValue("password")
在Go语言中,r.Form["password"] 返回的是 []string 类型(字符串切片),而 sha256 的 Write 方法需要 []byte 类型参数。你需要从字符串切片中提取单个字符串值进行哈希计算。
以下是修正后的代码:
func Login(w http.ResponseWriter, r *http.Request) {
r.ParseForm()
mysql_login(r.Form["username"], r.Form["password"])
}
func mysql_login(username []string, password []string) bool {
// 从字符串切片中获取第一个密码值
if len(password) == 0 {
return false
}
pwd := password[0]
// 创建SHA256哈希
h := sha256.New()
h.Write([]byte(pwd))
hash := h.Sum(nil)
// 将哈希转换为十六进制字符串用于数据库比较
hashHex := fmt.Sprintf("%x", hash)
// 同样处理用户名
if len(username) == 0 {
return false
}
user := username[0]
var dbUsername, dbPassword string
err := mysqlconnection.QueryRow(
"SELECT username, password FROM users WHERE username = ?",
user,
).Scan(&dbUsername, &dbPassword)
if err != nil {
if err == sql.ErrNoRows {
// 用户不存在
return false
}
panic(err.Error())
}
// 比较哈希后的密码
return hashHex == dbPassword
}
如果你需要处理多个密码值(虽然这在登录场景中不常见),可以这样处理:
func mysql_login(username []string, password []string) bool {
if len(username) == 0 || len(password) == 0 {
return false
}
user := username[0]
pwd := password[0]
// 对每个密码值分别计算哈希
for _, singlePassword := range password {
h := sha256.New()
h.Write([]byte(singlePassword))
hash := h.Sum(nil)
fmt.Printf("Password hash: %x\n", hash)
}
// 主要密码的哈希(使用第一个)
h := sha256.New()
h.Write([]byte(pwd))
hash := h.Sum(nil)
hashHex := fmt.Sprintf("%x", hash)
var dbUsername, dbPassword string
err := mysqlconnection.QueryRow(
"SELECT username, password FROM users WHERE username = ?",
user,
).Scan(&dbUsername, &dbPassword)
if err != nil {
return false
}
return hashHex == dbPassword
}
关键点:
r.Form["password"]返回[]string,你需要通过索引访问具体的字符串值- 使用
password[0]获取第一个密码值 - 将单个字符串转换为
[]byte进行哈希计算 - 考虑使用
fmt.Sprintf("%x", hash)将哈希结果转换为可读的十六进制字符串用于数据库比较


