Golang中的Bcrypt密码散列(与Node.js兼容)?

Cid*_*ang 56 go bcrypt node.js

我建立了一个带有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();
        });
    });
Run Code Online (Sandbox Code Playgroud)

如何使用Golang与Node.js bcrypt创建相同的散列字符串?

ANi*_*sus 107

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

hashedPassword, err := bcrypt.GenerateFromPassword(password, bcrypt.DefaultCost)
Run Code Online (Sandbox Code Playgroud)

工作范例:

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
}
Run Code Online (Sandbox Code Playgroud)

  • 嗯,这就是随机盐的好处 - 确保具有相同密码的两个用户不会有相同的(盐渍)哈希.[这里](https://crackstation.net/hashing-security.htm)是一篇冗长但很好的背景文章. (4认同)
  • 谢谢.我使用bcrypt.CompareHashAndPassword比较密码和db中node.js写的字符串,并返回nil.最初我认为生成的字符串总是相同的.现在我明白了.万分感激. (2认同)
  • @majidarif比较时,字符串也被散列; 它是设计的.创建哈希并比较哈希具有相同的成本.我说它按预期工作:) (2认同)

rob*_*b74 5

看看在bcrypt包go.crypto(文档是在这里).

要安装它,请使用

go get golang.org/x/crypto/bcrypt
Run Code Online (Sandbox Code Playgroud)

可以在此处找到描述bcrypt包使用情况的博客条目.这是来自编写包的人,所以它应该工作;)

你正在使用的node.js库的一个不同之处是go包没有(导出的)genSalt函数,但它会在你调用时自动生成salt bcrypt.GenerateFromPassword.