#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 спасибо человеку за идею. Действительно оценил это. Я буду иметь это в виду.