javascript - servidor - Almacenamiento de contraseñas con Node.js y MongoDB
node js pdf 2017 (2)
Estoy buscando algunos ejemplos de cómo almacenar de forma segura contraseñas y otros datos confidenciales utilizando node.js y mongodb.
Quiero que todo use una sal única que almacenaré junto con el hash en el documento mongo.
Para la autenticación, ¿debo sal y encriptar la entrada y hacerla coincidir con un hash almacenado?
¿Debo alguna vez necesitar descifrar esta información y, de ser así, cómo debería hacerlo?
¿Cómo se almacenan de forma segura las claves privadas, o incluso los métodos de salazón en el servidor?
Escuché que AES y Blowfish son buenas opciones, ¿qué debo usar?
¡Cualquier ejemplo de cómo diseñar esto sería maravillosamente útil!
¡Gracias!
Este es el mejor ejemplo que he encontrado hasta la fecha, utiliza node.bcrypt.js http://devsmash.com/blog/password-authentication-with-mongoose-and-bcrypt
Use esto: https://github.com/ncb000gt/node.bcrypt.js/
bcrypt es uno de los pocos algoritmos enfocados en este caso de uso. Nunca debería poder descifrar sus contraseñas, solo verificar que una contraseña de texto claro introducida por el usuario coincida con el hash almacenado / encriptado.
bcrypt es muy fácil de usar. Aquí hay un fragmento de mi esquema de Mongoose User (en CoffeeScript). Asegúrese de utilizar las funciones asíncronas ya que bycrypt es lento (a propósito).
class User extends SharedUser
defaults: _.extend {domainId: null}, SharedUser::defaults
#Irrelevant bits trimmed...
password: (cleartext, confirm, callback) ->
errorInfo = new errors.InvalidData()
if cleartext != confirm
errorInfo.message = ''please type the same password twice''
errorInfo.errors.confirmPassword = ''must match the password''
return callback errorInfo
message = min4 cleartext
if message
errorInfo.message = message
errorInfo.errors.password = message
return callback errorInfo
self = this
bcrypt.gen_salt 10, (error, salt)->
if error
errorInfo = new errors.InternalError error.message
return callback errorInfo
bcrypt.encrypt cleartext, salt, (error, hash)->
if error
errorInfo = new errors.InternalError error.message
return callback errorInfo
self.attributes.bcryptedPassword = hash
return callback()
verifyPassword: (cleartext, callback) ->
bcrypt.compare cleartext, @attributes.bcryptedPassword, (error, result)->
if error
return callback(new errors.InternalError(error.message))
callback null, result
Además, lea este artículo, que debe convencerlo de que bcrypt es una buena opción y lo ayudará a evitar convertirse en "realmente eficaz".