Использование bcrypt с node.js для аутентификации пользователей. Это безопасно? Нужны ли случайные данные? - PullRequest
0 голосов
/ 03 октября 2019

Я немного параноик, и я знаю, что это плохая идея, вообще говоря, использовать свой собственный метод аутентификации, но для проекта, над которым я работаю, мне нужен простой метод аутентификации, и я не хотел использовать сеансы илиpassport.js для ограничения библиотек и зависимостей. Мне нужно только аутентифицировать одного пользователя, так что вот что я придумал. Это работает, но я далеко не эксперт по безопасности, поэтому кто-нибудь может прокомментировать, если это безопасно или я что-то упустил.

В основном все сводится к шифрованию случайных данных + времени истечения срока действия входа в систему + секрета сервера,и установление полученного хэша в виде одного куки-файла и случайных данных + время истечения срока действия входа в систему (очевидно, без учета секрета сервера) в другом куки-файле.

const bcrypt = require("bcrypt");

const serverSecret = "Some Secret Stugg Goes Here";

// Cookie Validation Function
function loginCookieValidate(cookie, signature, serverSecret, callback){
  const cookieBody = cookie + serverSecret;
  bcrypt.compare(cookieBody, signature, (err, res) => {
    if(err){
      console.log("Cookie Decryption Error!");
      console.log(err);
      callback(false);
    }else{
      if(res && cookie.includes("ValidUntil:")){
        const time = parseInt(cookie.split(':')[1]);
        if(time && time >= Date.now()){
          callback(true);
        } else {
          callback(false);
        }
      }else{
        callback(false);
      }
    }
  });
}

// Cookie Generation Function
function loginCookieGenerate(serverSecret, loginTimeout, callback){
  const prefix = "ValidUntil";
  const time = Date.now() + 1000 * 60 * loginTimeout;
  const random = Math.random().toString();
  const cookieBody = prefix + ":" + time + ":" + random;
  const cookieBodyWithSecret = cookieBody + serverSecret;
  bcrypt.hash(cookieBodyWithSecret, 10, function(err, hash){
    if(err){
      console.log("Cookie Encryption Error!");
      console.log(err);
    }else{
      callback(cookieBody, hash);
    }
  });
}

var myCookie = "";
var mySignature = "";

loginCookieGenerate(serverSecret, 60, (cookie, signature)=> {
  console.log(cookie);
  console.log(signature);
  myCookie = cookie;
  mySignature = signature;

  loginCookieValidate(myCookie, mySignature, serverSecret, (isValid) => {
    if(isValid){
      console.log("The Cookie is Valid!");
    }else{
      console.log("We got a bad Cookie!");
    }
  });

  loginCookieValidate(myCookie + "something", mySignature, serverSecret, (isValid) => {
    if(isValid){
      console.log("The Cookie is Valid!");
    }else{
      console.log("We got a bad Cookie!");
    }
  });

  loginCookieValidate("something", mySignature, serverSecret, (isValid) => {
    if(isValid){
      console.log("The Cookie is Valid!");
    }else{
      console.log("We got a bad Cookie!");
    }
  });
});

Итак, мои 2 вопроса:

  1. Это безопасный метод?
  2. Нужны ли мне дополнительные случайные данные или они не нужны?
  3. Стоит ли использовать подпись cookie, встроенную в экспресс?

Спасибо!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...