【问题标题】:Bcrypt password hashing in Golang (compatible with Node.js)?Golang 中的 Bcrypt 密码散列(与 Node.js 兼容)?
【发布时间】:2014-06-09 04:31:36
【问题描述】:

我使用 Node.js+passport 设置了一个站点以进行用户身份验证。

现在我需要迁移到 Golang,并且需要使用保存在 db 中的用户密码进行身份验证。

Node.js 加密代码为:

    var bcrypt = require('bcrypt');

    bcrypt.genSalt(10, function(err, salt) {
        if(err) return next(err);

        bcrypt.hash(user.password, salt, function(err, hash) {
            if(err) return next(err);
            user.password = hash;
            next();
        });
    });

如何使用 Golang 制作与 Node.js bcrypt 相同的哈希字符串?

【问题讨论】:

    标签: node.js go bcrypt


    【解决方案1】:

    看看来自go.cryptobcrypt package(文档是here)。

    要安装它,请使用

    go get golang.org/x/crypto/bcrypt
    

    可以在here 找到描述 bcrypt 包用法的博客条目。它来自编写包的人,所以它应该可以工作;)

    与您使用的 node.js 库的一个区别是 go 包没有(导出的)genSalt 函数,但是当您调用 bcrypt.GenerateFromPassword 时它会自动生成盐。

    【讨论】:

      【解决方案2】:

      使用 golang.org/x/crypto/bcrypt 包,我相信等价于:

      hashedPassword, err := bcrypt.GenerateFromPassword(password, bcrypt.DefaultCost)
      

      工作示例:

      package main
      
      import (
          "golang.org/x/crypto/bcrypt"
          "fmt"
      )
      
      func main() {
          password := []byte("MyDarkSecret")
      
          // Hashing the password with the default cost of 10
          hashedPassword, err := bcrypt.GenerateFromPassword(password, bcrypt.DefaultCost)
          if err != nil {
              panic(err)
          }
          fmt.Println(string(hashedPassword))
      
          // Comparing the password with the hash
          err = bcrypt.CompareHashAndPassword(hashedPassword, password)
          fmt.Println(err) // nil means it is a match
      }
      

      【讨论】:

      • 谢谢。我使用 bcrypt.CompareHashAndPassword 比较密码和 node.js 在db中写入的字符串,并返回 nil。本来我以为生成的字符串总是一样的。现在我明白了。真的很感激。
      • @user2036213:我之前也从未使用过 bcrypt,每次运行都会为相同的密码生成一个新的哈希,这让我有点惊讶。但它仍然可以正常工作。我们每天都在学习新事物:)。 Go 编码快乐!
      • 呃,这就是随机盐的好处——确保两个具有相同密码的用户不会有相同的(加盐的)哈希。 Here 是一篇很长但很好的背景文章。
      • @rob74:我明白了。我错过了一个事实,即 bcrypt 生成的哈希包括 bcrypt 版本、成本、盐和密码,而不仅仅是密码 (stackoverflow.com/a/6833165/694331)。感谢您的文章!
      • @majidarif 比较时,字符串也会被散列;这是设计使然。创建散列和比较散列具有相同的成本。我会说它按预期工作:)
      【解决方案3】:

      首先你需要导入 bcrypt 包

      go get golang.org/x/crypto/bcrypt
      

      然后使用 GenerateFromPassword

      bs, err := bcrypt.GenerateFromPassword([]byte(p), bcrypt.MinCost)
          if err != nil {
              http.Error(w, "Internal server error", http.StatusInternalServerError)
              return
          }
      

      【讨论】:

        猜你喜欢
        • 2019-07-20
        • 2014-05-14
        • 1970-01-01
        • 1970-01-01
        • 2013-04-24
        • 1970-01-01
        • 1970-01-01
        • 2012-12-10
        • 1970-01-01
        相关资源
        最近更新 更多