Подтвердить что ты не робот

Хеширование паролей 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?

4b9b3361

Ответ 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.