Я немного параноик, и я знаю, что это плохая идея, вообще говоря, использовать свой собственный метод аутентификации, но для проекта, над которым я работаю, мне нужен простой метод аутентификации, и я не хотел использовать сеансы или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 вопроса:
- Это безопасный метод?
- Нужны ли мне дополнительные случайные данные или они не нужны?
- Стоит ли использовать подпись cookie, встроенную в экспресс?
Спасибо!