web-dev-qa-db-fra.com

Hachage de mot de passe Bcrypt dans Golang (compatible avec Node.js)?

J'ai mis en place un site avec Node.js + passeport pour l'authentification des utilisateurs.

Maintenant, je dois migrer vers Golang et je dois faire l'authentification avec les mots de passe utilisateur enregistrés dans db.

Le code de chiffrement Node.js est:

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

Comment créer la même chaîne de hachage que Node.js bcrypt avec Golang?

55
Cid Huang

En utilisant le paquet golang.org/x/crypto/bcrypt , je pense que l'équivalent serait:

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

Exemple de travail:

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
}
104
ANisus

Jetez un œil au paquet bcrypt de go.crypto (les documents sont ici ).

Pour l'installer, utilisez

go get golang.org/x/crypto/bcrypt

Une entrée de blog décrivant l'utilisation du paquet bcrypt peut être trouvée ici . C'est du gars qui a écrit le paquet, donc ça devrait marcher;)

Une différence par rapport à la bibliothèque node.js que vous utilisez est que le package go n'a pas de fonction (exportée) genSalt, mais il générera automatiquement le sel lorsque vous appellerez bcrypt.GenerateFromPassword.

5
rob74