2012-07-17 18 views
7

Voglio creare un hash salt utilizzando node.js crypto lib senza dover analizzare alcun dato hardcoded.Come creare un hash salt-salt con crypto

Cosa intendo con hardcoded?

var salt, hardcodedString = "8397dhdjhjh"; 
crypto.createHmac('sha512', hardcodedString).update(salt).digest("base64"); 

Non c'è nessun altro modo come posso creare una stringa casuale senza utilizzare javascript prime, funzioni random o brutalmente qualcosa?

saluti

UPDATE

var Crypto = require('crypto') 
    , mongoose = require('mongoose'); 

module.exports = mongoose.model('User', new mongoose.Schema({ 
    username: { 
     type: String 
     , required: true 
     , index: { unique: true, sparse: true } 
     , set: toLower 
    }, 
    email: { 
     type: String 
     , required: true 
     , index: { unique: true, sparse: true } 
     , set: toLower 
    }, 
    salt: { 
     type: String 
     , set: generateSalt 
    }, 
    password: { 
     type: String 
     , set: encodePassword 
    } 
}),'Users'); 

function toLower(string) { 
    return string.toLowerCase(); 
} 

function generateSalt() { 
    //return Math.round((new Date().valueOf() * Math.random())) + ''; 
    Crypto.randomBytes('256', function(err, buf) { 
     if (err) throw err; 
     return buf; 
    }); 
    // return Crypto.randomBytes('256'); // fails to 
} 

function encodePassword(password) { 
    return password; 
    // TODO: setter has no access to this.salt 
    //return Crypto.createHmac('sha512', salt).update(password).digest("base64"); 
} 

function authenticate(plainPassword) { 
    return encodePassword(plainPassword) === this.password; 
} 
+2

btw HMAC non è un hash della password sicuro. 'crypto.pbkdf2' con> 50000 iterazioni è una scelta decente. – CodesInChaos

+4

^- Si chiama ['stretching'] (http://throwingfire.com/storing-passwords-securely/) per coloro che non lo sanno. –

+0

Ottimo collegamento. È bello trovare un post che contenga un sacco di informazioni sull'argomento e con una buona spiegazione. –

risposta

16

Un rapido sguardo alla documentazione trasforma la funzione crypto.randomBytes.

var buf = crypto.randomBytes(16); 

Restituisce un buffer contenente byte non elaborati. Se si desidera una stringa, è possibile utilizzare toString('base64') o toString('hex').

+0

Non riesco a usarlo con la mangusta. Vedi aggiornamento sopra –

+0

Perché stai citando il numero? E i 256 byte sono un po 'lunghi per un salt, i 256 nel mio post sono solo citazioni dell'esempio. – CodesInChaos

+0

Sry, modificato per restituire Crypto.randomBytes (256); .. ancora senza sale nel documento mongodb. Verificherò se questo è un problema di mangusta –

Problemi correlati