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

Bcrypt password hashing in Golang (compatible with Node.js)?

我用node.js+passport设置了一个站点,用于用户身份验证。

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

node.js加密代码为:

1
2
3
4
5
6
7
8
9
10
11
    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相同的哈希字符串?


使用golang.org/x/crypto/bcrypt包,我相信等效软件将是:

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

工作示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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
}


查看go.crypto中的bcrypt包(文档在这里)。

要安装它,请使用

1
go get golang.org/x/crypto/bcrypt

在这里可以找到描述bcrypt包用法的日志。这是那个写包裹的人写的,所以应该可以用;)

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