Шифрование шифрованием одной и той же строки в другую строку?

#node.js #encryption

#node.js #шифрование

Вопрос:

При регистрации я шифрую пароль и сохраняю его в БД. При входе в систему я снова шифрую пароль и пытаюсь сопоставить его с паролем в базе данных во время извлечения данных as SELECT * FROM table where uname=Username AND pwd=encryptedPasswd . Но пароли не совпадают, даже если я ввел то же самое. Как это решить? Ниже приведен мой код. pswd при регистрации и pswds при входе в систему не совпадают.

Регистрация

 app.post("/register", function(req, res){
    // Assume I have a value in post.pwd
    var pswd = cipher.update(post.pwd, 'utf8', 'hex');
    pswd = "'"   pswd   cipher.final('hex')   "',";
    console.log(pswd);
    // Assume I have variable with value
    conn.query("INSERT INTO users VALUES (name, pswd)", function(err, rows, fields){
            if(!err){
                res.send(User);
            } else{
                console.log('Error while parsing the query...');
            }
        });
    }
});
  

Вход

 app.post('/login', function(req, res){


    var pswds = cipher.update(req.body.pwd, 'utf8', 'hex');
    pswds = "'"   pswds   cipher.final('hex')   "',";
    pswds = "'"   pswds   "',";
    console.log(pswds);

    var query = conn.query("SELECT * FROM users WHERE phone='"   req.body.phone  
        "AND pwd='"   pswds   "'", function(err, rows, fields){
        const decipher = crypto.createDecipher('aes192', 'encryptedpwd');
        var pswrd = decipher.update(rows[0].pwd, 'hex', 'utf8');
        pswrd = pswrd   decipher.final('utf8');
        pswrd = pswrd.substring(1, pswrd.length-2);
        if(!err amp;amp; req.body.pwd == pswrd){
            res.send(rows[0]);
        } else{
            console.log('Error while parsing the query...');
        }
    });
});
  

Оставьте о синтаксисе, он работает нормально. Но оба пароля при регистрации и входе в систему не совпадают, даже если я ввел правильно.

Комментарии:

1. Вы никогда не должны шифровать пароли своих пользователей. Вместо этого вам нужно использовать хеширование с некоторыми сильными, такими как PBKDF2, bcrypt, scrypt и Argon2. Поскольку хэш-функции являются односторонними, вы не сможете «расшифровать» хэши. Чтобы аутентифицировать вашего пользователя, вы можете снова запустить пароль через хэш-функцию, чтобы сравнить с хэшем, который хранится в базе данных. Показать еще: Как безопасно хэшировать пароли?

2. Используя хэш, я также должен сделать то же самое. Я должен дважды вызвать hash.digest. Если я это сделаю, появится ошибка. Если я хочу это сделать, я также должен вызвать update, что приводит к разным зашифрованным строкам. Ответьте на мой вопрос. Не комментируйте. @Artjom

Ответ №1:

Наконец-то я получил ответ на свой вопрос. Когда кто-то сталкивается с описанной выше ситуацией, ему просто нужно обернуть часть шифрования в функцию, а затем он должен вызвать эту функцию из разных вызовов post. Я изменил алгоритм с aes192 на aes-256-gcm. Вот мой код:

 var crypto = require('crypto'),
    algorithm = 'aes-256-gcm',
    password = '3zTvzr3p67VC61jmV54rIYu1545x4TlY', // must be 32-bytes
    // do not use a global iv for production, 
    // generate a new one for each encryption
    iv = '60iP0h6vJoEa'; // must be 16-bytes

var encryptText = function(text){
    var cipher = crypto.createCipheriv(algorithm, password, iv)
    var encrypted = cipher.update(text, 'utf8', 'hex')
    encrypted  = cipher.final('hex');
    return encrypted;   
}
app.post("/register", function(req, res){
    var pswd = encryptText(req.body.pwd);
    console.log(pswd);
})
app.post("/login", function(req, res){
    var pswd = encryptText(req.body.pwd);
    console.log(pswd);
})
  

Теперь пароли совпадают в обоих случаях. И пароль должен быть 32-байтовым, а iv должен быть 16-байтовым