Хеширование паролей Bcrypt в Голанге (совместимо с Node.js)?
Я установил сайт с паспортом Node.js + для аутентификации пользователя.
Теперь мне нужно перейти на 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();
});
});
Как сделать такую же хэшированную строку как Node.js bcrypt с Golang?
Ответы
Ответ 1
Используя пакет 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
}
Ответ 2
Взгляните на пакет bcrypt из go.crypto (docs здесь).
Чтобы установить его, используйте
go get golang.org/x/crypto/bcrypt
(вам нужно установить mercurial, чтобы иметь возможность использовать go get с code.google.com)
В блоге, описывающей использование пакета bcrypt, можно найти здесь. Это от парня, который написал пакет, поэтому он должен работать;)
Одно отличие от библиотеки node.js, которую вы используете, состоит в том, что пакет go не имеет (экспортированной) функции genSalt, но он будет генерировать соль автоматически, когда вы вызываете bcrypt.GenerateFromPassword.