2012-07-17 17 views
7

Quiero crear un salt-hash usando node.js crypto lib sin tener que analizar ningún dato codificado.Cómo crear random-salt-hash con crypto

¿Qué quiero decir con hardcoded?

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

¿No hay otra manera de cómo puedo crear una cadena aleatoria sin usar javascript en bruto, funciones aleatorias o algo de codificación rígida?

Saludos

ACTUALIZACIÓN

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 plain HMAC no es un hash de contraseña segura. 'crypto.pbkdf2' con> 50000 iteraciones es una elección decente. – CodesInChaos

+4

^- Eso se llama ['stretching'] (http://throwingfire.com/storing-passwords-securely/) para quienes no lo sepan. –

+0

Muy buen enlace. Es bueno encontrar una publicación que contenga mucha información sobre el tema y una buena explicación. –

Respuesta

16

Un rápido vistazo a la documentación se convierte en imagen la función crypto.randomBytes.

var buf = crypto.randomBytes(16); 

Esto devuelve un búfer que contiene bytes sin procesar. Si desea una cadena, puede usar toString('base64') o toString('hex').

+0

No logro usar esto con mangosta. Ver actualización arriba –

+0

¿Por qué estás citando el número? Y 256 bytes es un poco largo para una sal, los 256 en mi publicación son solo citas del ejemplo. – CodesInChaos

+0

Sry, cambiado para devolver Crypto.randomBytes (256); .. aún no hay sal en el documento de mongodb. Voy a verificar si este es un problema de mangosta –

Cuestiones relacionadas