我使用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制作相同的散列字符串?
答案 0 :(得分:103)
使用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
}
答案 1 :(得分:5)
查看bcrypt package中的go.crypto(文档为here)。
要安装它,请使用
go get golang.org/x/crypto/bcrypt
可以找到描述bcrypt包使用情况的博客条目here。它来自编写软件包的人,所以应该可以工作;)
您正在使用的node.js库的一个区别是go包没有(导出的)genSalt
函数,但是当您调用{{1}时它会自动生成salt }。
答案 2 :(得分:0)
首先,您需要导入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
}