2014-04-24 3 views
42

Ho impostato un sito con Node.js + passaporto per l'autenticazione dell'utente.Bash dell'hash di password in Golang (compatibile con Node.js)?

Ora ho bisogno di migrare a Golang e devo fare l'autenticazione con le password utente salvate in db.

Il codice di crittografia 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(); 
     }); 
    }); 

Come fare la stessa stringa hash come Node.js bcrypt con Golang?

risposta

88

Usando il pacchetto golang.org/x/crypto/bcrypt, credo che l'equivalente sarebbe:

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

esempio di lavoro:

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

Grazie. Uso bcrypt.CompareHashAndPassword per confrontare la password e la stringa scritta da node.js in db e restituire nil. Inizialmente pensavo che le stringhe generate fossero sempre le stesse. Ora capisco. Apprezzo davvero. –

+0

@ user2036213: Non ho mai usato bcrypt prima e sono rimasto un po 'sorpreso dal fatto che ogni esecuzione ha generato un nuovo hash per la stessa password. Ma funziona ancora bene. Impariamo cose nuove ogni giorno :). Happy Go codifica! – ANisus

+2

Erm, questo è il motivo per cui il sale random è utile, per assicurarsi che due utenti con la stessa password non abbiano lo stesso hash (salato). [Here] (https://crackstation.net/hashing-security.htm) è un articolo di fondo lungo ma buono. – rob74

3

Dai uno sguardo allo bcrypt package da go.crypto (documenti here).

Per installarlo, utilizzare

go get golang.org/x/crypto/bcrypt 

(è necessario installare mercurial per essere in grado di utilizzare andare a prendere con code.google.com)

Un blog che descrive l'utilizzo del pacchetto bcrypt può essere trovato here. È dal tizio che ha scritto il pacchetto, quindi dovrebbe funzionare;)

Una differenza rispetto alla libreria node.js che si sta utilizzando è che il pacchetto go non ha una funzione genSalt (esportata), ma genererà sale automaticamente quando chiami bcrypt.GenerateFromPassword.