Usa 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 verifique que una contraseña de texto claro ingresada por el usuario coincida con el hash almacenado/cifrado.
bcrypt es muy fácil de usar. Aquí hay un fragmento de mi esquema de usuario Mongoose (en CoffeeScript). Asegúrese de usar 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 debería convencerlo de que bcrypt es una buena opción y ayudarlo a evitar que se sienta "realmente afectado".