2016-10-04 4 views
-2

При регистрации я шифрую пароль и сохраняю его в БД. При входе в систему я снова шифрую пароль и пытаюсь совместить с паролем в БД во время извлечения данных как 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 && req.body.pwd == pswrd){ 
      res.send(rows[0]); 
     } else{ 
      console.log('Error while parsing the query...'); 
     } 
    }); 
}); 

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

+3

Вы никогда не должны шифровать пароли своего пользователя. Вместо этого вам нужно использовать хеширование, а некоторые сильные - PBKDF2, bcrypt, scrypt и Argon2. Поскольку хеш-функции являются однонаправленной, вы не сможете «расшифровать» хеши. Чтобы аутентифицировать пользователя, вы можете снова запустить пароль через хеш-функцию, чтобы сравнить с хешем, который хранится в базе данных. Подробнее: [Как безопасно использовать хэш-пароли?] (Http://security.stackexchange.com/q/211/45523) –

+0

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

ответ

0

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

Смежные вопросы