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 回复

看起来您试图将字符串切片转换为字节切片,而不是普通字符串。您能否在 mysql_login 中使用字符串作为参数,而不是 []string?

更多关于Golang如何从字符串切片创建哈希的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


我有一个修复方法。 只需将

r.Form["password"]

替换为

r.FormValue("password")

在Go语言中,r.Form["password"] 返回的是 []string 类型(字符串切片),而 sha256Write 方法需要 []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) 将哈希结果转换为可读的十六进制字符串用于数据库比较
回到顶部