Расшифровать существующие данные из php в nodejs

#php #node.js #express #cryptography

#php #node.js #экспресс #криптография

Вопрос:

действительно нужна помощь с этим. У меня есть проект, над которым я работаю в nodejs, но приложение имеет 2 разные платформы (CodeIgniter и NodeJS) с одной и той же базой данных. У меня проблема с расшифровкой паролей пользователей в NodeJS. 2 проекта состоят из разных форм входа, но он считывает только одну базу данных.

Для части CodeIgniter. Это то, как другие разработчики используют хэш в паролях

 function encryptIt( $password )
{
    $encrypt_method  = 'AES-256-CBC';
    $secret_key = 'This is my secret key';
    $key = hash('sha256', $secret_key);
    $secret_iv = 'This is my secret iv';
    $iv = substr(hash('sha256', $secret_iv), 0, 16);

    $this ->session->set_flashdata('iv', $iv);
    $this ->session->set_flashdata('key', $key);

    $qEncoded = base64_encode(openssl_encrypt($password, $encrypt_method, $key, 0, $iv));

    return( $qEncoded );

}

function decryptIt( $password )
{
    $decrypt_method = 'AES-256-CBC';

    $sess_data =  $this->session->userdata('logged_in');
    $iv = $sess_data['iv'];
    $key = $sess_data['key'];   
    
    $qDecoded = openssl_decrypt(base64_decode($password), $decrypt_method, $key, 0, $iv);
    return( $qDecoded );
}
  

И на моей стороне, пока я пытаюсь что-то сделать, как расшифровать пароль в node.js , Я использую криптографию. Я также создал API для получения запроса имени пользователя и пароля на стороне клиента. Это мой код

 const crypto = require('crypto');
// Defining key 
const key = crypto.randomBytes(32); 

// A decrypt function 
function decrypt(text) { 
  
  let iv = Buffer.from(text.iv, 'base64'); 
  let encryptedText = 
     Buffer.from(text.encryptedData, 'base64'); 
   
  // Creating Decipher 
  let decipher = crypto.createDecipheriv( 
         'aes-256-cbc', Buffer.from(key), iv); 
   
  // Updating encrypted text 
  let decrypted = decipher.update(encryptedText); 
  decrypted = Buffer.concat([decrypted, decipher.final()]); 
   
  // returns data after decryption 
  return decrypted.toString(); 
 } 

const express = require('express');
const router = express.Router();

const UserAccounts = require('../../models/user_account.model');


//@route /api/useraccounts/login
//@desc POST Get the data based in what username and password have entered
//@access public
router.post('/login', (req, res) => {

  //Username input
  const input = {
    username: req.body.USERNAME,
    password: req.body.PASSWORD
  };

  // check if the input is correct 
  UserAccounts.login(input, (err, data) => {
    if(err){
        res.status(400).json({
          account: 'User not found'
        });
    }

    else  {
      const passwordDecryption = data.PASSWORD.toString();
 
      console.log(decrypt(passwordDecryption)); 
    }
  });

});
  

Но, к сожалению, это выдает ошибку

 TypeError [ERR_INVALID_ARG_TYPE]: The first argument must be of type string or an instance of Buffer, ArrayBuffer, or Array or an Array-like Object. Received undefined
  

Я что-то упускаю в своем коде? или есть лучший способ расшифровать пароль, который уже хэширован в базе данных? Спасибо за помощь.

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

1. Не углубляясь в анализ — на стороне NodeJS вы генерируете новый случайный ключ, который не может работать, и должен использоваться тот же ключ, что и на стороне шифрования. Во-вторых: я не вижу, чтобы тот же iv присутствовал на стороне NodeJS. Предупреждение о безопасности : в вашем коде используется статический iv, который делает шифрование уязвимым и НЕБЕЗОПАСНЫМ . Лучше использовать случайный iv и передать его вместе с зашифрованным текстом получателю.

2. Вывод ключа (с использованием дайджеста) в целом, похоже, отсутствует в коде NodeJS. Также было бы полезно, если бы вы описали заполнение text , потому что, очевидно, IV и зашифрованный текст содержатся здесь. Лучше всего опубликовать пример $password $secret_key и $secret_iv включить сгенерированный зашифрованный текст для кода PHP и результирующие параметры, используемые в коде NodeJS. В качестве дополнительного примечания (поскольку я не знаю вашу архитектуру в деталях), пароли должны быть не зашифрованы, а хэшированы.

3. Хм, понятно. Я буду работать над этим. На данный момент моим приоритетом является расшифровка существующего пароля, чтобы, если код теперь работает, я мог работать над безопасностью приложения. Как я могу расшифровать хэш-пароль точно так же, как функция decryptIt() на стороне CodeIgniter?

4. Обязательным условием для успешного дешифрования является использование ключа и IV из шифрования. Оба они получены в коде PHP из ключевой фразы с использованием SHA256 (что не очень безопасно). Это отсутствует в коде NodeJS, который может быть реализован, например, с Hash помощью класса.

5. @Topaco спасибо человеку за идею. Действительно оценил это. Я буду иметь это в виду.