在Golang中使用Bcrypt进行密码哈希(与Node.js兼容)?

huangapple go评论92阅读模式
英文:

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

问题

我使用Node.js+passport设置了一个用于用户身份验证的网站。

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

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相同的哈希字符串?

英文:

I set up a site with Node.js+passport for user authentication.

Now I need to migrate to Golang, and need to do authentication with the user passwords saved in db.

The Node.js encryption code is:

    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();
        });
    });

How to make the same hashed string as Node.js bcrypt with Golang?

答案1

得分: 154

使用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")

	// 使用默认成本对密码进行哈希
	hashedPassword, err := bcrypt.GenerateFromPassword(password, bcrypt.DefaultCost)
	if err != nil {
		panic(err)
	}
	fmt.Println(string(hashedPassword))

	// 将密码与哈希进行比较
	err = bcrypt.CompareHashAndPassword(hashedPassword, password)
	fmt.Println(err) // nil表示匹配成功
}

以上是翻译好的内容,请确认是否满意。

英文:

Using the golang.org/x/crypto/bcrypt package, I believe the equivalent would be:

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

Working example:

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
}

答案2

得分: 8

请看一下来自go.cryptobcrypt包(文档在这里)。

要安装它,请使用以下命令:

go get golang.org/x/crypto/bcrypt

可以在这里找到描述bcrypt包用法的博客文章。这篇文章是由编写该包的人撰写的,所以应该有效 在Golang中使用Bcrypt进行密码哈希(与Node.js兼容)?

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

英文:

Take a look at the bcrypt package from go.crypto (docs are here).

To install it, use

go get golang.org/x/crypto/bcrypt

A blog entry describing the usage of the bcrypt package can be found here. It's from the guy who wrote the package, so it should work 在Golang中使用Bcrypt进行密码哈希(与Node.js兼容)?

One difference to the node.js library you are using is that the go package doesn't have an (exported) genSalt function, but it will generate the salt automatically when you call bcrypt.GenerateFromPassword.

答案3

得分: 2

首先,你需要导入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
}

请注意,这是一个示例代码片段,用于使用bcrypt包生成密码哈希值。在实际使用时,你需要根据自己的需求进行适当的修改和调整。

英文:

Firstly you need import the bcrypt package

go get golang.org/x/crypto/bcrypt

Then use GenerateFromPassword

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

答案4

得分: 0

另一种方式

dataEncrypt, _ := bcrypt.GenerateFromPassword([]byte(yourData), bcrypt.DefaultCost)

第二个参数'bcrypt'可以取多个值
用于比较的代码如下

error := bcrypt.CompareHashAndPassword([]byte(yourDataEncript), []byte(dataText))

在密码使用中非常有用。

英文:

Another way

dataEncrypt, _ := bcrypt.GenerateFromPassword([]byte(yourData), bcrypt.DefaultCost)

the second parameter 'bcrypt' can take multiple values
and for compare you can use

error := bcrypt.CompareHashAndPassword([]byte(yourDataEncript), []byte(dataText))

very useful for password use

huangapple
  • 本文由 发表于 2014年4月24日 12:03:58
  • 转载请务必保留本文链接:https://go.coder-hub.com/23259586.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定