Подтвердить что ты не робот

Node.js хеширование паролей

В настоящее время я использую следующее для хэширования паролей:

var pass_shasum = crypto.createHash('sha256').update(req.body.password).digest('hex');

Не могли бы вы предложить улучшения, чтобы сделать проект более безопасным?

4b9b3361

Ответ 1

Я использую следующий код для соли и хэш-паролей.

var bcrypt = require('bcrypt');

exports.cryptPassword = function(password, callback) {
   bcrypt.genSalt(10, function(err, salt) {
    if (err) 
      return callback(err);

    bcrypt.hash(password, salt, function(err, hash) {
      return callback(err, hash);
    });
  });
};

exports.comparePassword = function(plainPass, hashword, callback) {
   bcrypt.compare(plainPass, hashword, function(err, isPasswordMatch) {   
       return err == null ?
           callback(null, isPasswordMatch) :
           callback(err);
   });
};

Ответ 2

bcrypt также можно вызвать синхронно. Пример Coffeescript:

bcrypt = require('bcrypt')

encryptionUtil = 
    encryptPassword: (password, salt) ->
        salt ?= bcrypt.genSaltSync()
        encryptedPassword = bcrypt.hashSync(password, salt)
        {salt, encryptedPassword}

    comparePassword: (password, salt, encryptedPasswordToCompareTo) ->
        {encryptedPassword} = @encryptPassword(password, salt)
        encryptedPassword == encryptedPasswordToCompareTo

module.exports = encryptionUtil

Ответ 3

Также существует модуль bcrypt-nodejs для node. https://github.com/shaneGirish/bcrypt-nodejs.

Ранее я использовал уже упомянутый здесь модуль bcrypt, но попадал в проблемы на win7 x64. С другой стороны, bcrypt-nodejs является чистой реализацией JS-кода bcrypt и не имеет каких-либо зависимостей вообще.

Ответ 4

Вы можете использовать пакет bcrypt-js для шифрования пароля.

  1. Попробуйте npm i bcryptjs
  2. var bcrypt = require ('bcryptjs') вверху.
  3. Для хеширования пароля:
bcrypt.genSalt(10, function(err, salt) {
    bcrypt.hash("B4c0/\/", salt, function(err, hash) {
        // Store hash in your password DB.
    });
});
  1. Чтобы проверить свой пароль,
// Load hash from your password DB.
bcrypt.compare("B4c0/\/", hash, function(err, res) {
    // res === true
});

Вы можете посетить https://www.npmjs.com/package/bcryptjs для получения дополнительной информации о bcryptjs.

Ответ 5

Попробуйте использовать Bcrypt, он защищает пароль с помощью хеширования.

bcrypt.hash(req.body.password, salt, (err, encrypted) => {
    user.password = encrypted
    next()
})

Где соль - это стоимость, которая определяет силу хеширования. При входе в систему сравните пароль, используя метод bcrypt.compare:

 bcrypt.compare(password, user.password, (err, same) => {
      if (same) {
           req.session.userId = user._id
           res.redirect('/bloglist')
      } else {
           res.end('pass wrong')
      }
 })

Для получения дополнительной информации обратитесь к этому блогу: https://medium.com/@nitinmanocha16/bcrypt-and-nodejs-e00a0d1df91f

Ответ 6

Bcrypt - неплохой выбор, но есть несколько ошибок:

  1. Он будет усечен до NUL байтов.
  2. Он будет усечен после 72 символов. Если вы используете парольные фразы, это может неожиданно ослабить ваш пароль.

По состоянию на октябрь 2019 года Argon2id является оптимальным выбором.

Предпочтительным способом взаимодействия с Argon2id является libsodium (криптографическая библиотека, которая предоставляет множество функций). Есть несколько привязок на выбор, но самый простой, вероятно, натрий-плюс.

const SodiumPlus = require('sodium-plus').SodiumPlus;
let sodium;
(async function(){
    if (!sodium) sodium = await SodiumPlus.auto(); // Autoload the backend

    let password = 'Your example password goes here. Provided by the user.';

    // Hashing...
    let hash = await sodium.crypto_pwhash_str(
        password,
        sodium.CRYPTO_PWHASH_OPSLIMIT_INTERACTIVE,
        sodium.CRYPTO_PWHASH_MEMLIMIT_INTERACTIVE
    );
    // You can safely store {hash} in a database.

    // Checking that a stored hash is still up to snuff...
    let stale = await sodium.crypto_pwhash_str_needs_rehash(
        hash,
        sodium.CRYPTO_PWHASH_OPSLIMIT_INTERACTIVE,
        sodium.CRYPTO_PWHASH_MEMLIMIT_INTERACTIVE
    );
    if (stale) {
        // Rehash password, update database
    }

    // Password verification
    let valid = await sodium.crypto_pwhash_str_verify(password, hash);
    if (valid) {
        // Proceed...
    }
})();

Документация по дляodium-plus на Github включает хеширование и хранение паролей.