2016-05-18 2 views
0

Я пытаюсь воссоздать функцию шифрования, которую мы имеем в нашем старом PHP-приложении, в новое приложение Node JS, используя модуль Node mycrypt.Преобразование вызова PHP mcrypt() в mcrypt узла

Моя цель - удостовериться, что, учитывая ту же самую оригинальную строку и соль, скрипт PHP ниже дает такое же зашифрованное значение, что и сценарий узла.


PHP

<?php 
$string = 'This is my password'; 
$salt = 'sodiumChloride12'; 
$encrypted = base64_encode(
    mcrypt_encrypt(
     MCRYPT_RIJNDAEL_128, 
     $salt, 
     $string, 
     MCRYPT_MODE_ECB, 
     mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_ECB), MCRYPT_RAND) 
    ) 
); 

echo "Encrypted: $encrypted\n"; 

Он производит:

Encrypted: iOKEAxaE4vIeWXBem01gHr2wdof7ZO2dld3BuR9l3Nw= 

JavaScript

var mcrypt = require('mcrypt'); 
var MCrypt = mcrypt.MCrypt; 

// Set algorithm and mode 
var rijndaelEcb = new MCrypt('rijndael-128', 'ecb'); 

// Set up salt and IV 
var salt = 'sodiumChloride12'; 
var iv = rijndaelEcb.generateIv(); 
rijndaelEcb.open(salt, iv); 

/** ENCRYPTION **/ 
var cipher = rijndaelEcb.encrypt('This is my password'); 
var cipherConcat = Buffer.concat([iv, cipher]).toString('base64'); 
console.log('Encrypted: ' + cipherConcat); 

/** DECRYPTION **/ 
// Convert back from base64 
var ivAndCipherText = new Buffer(cipherConcat, 'base64'); 

// Undo concat of IV 
var ivSize = rijndaelEcb.getIvSize(); 
iv = new Buffer(ivSize); 
var cipherText = new Buffer(ivAndCipherText.length - ivSize); 
ivAndCipherText.copy(iv, 0, 0, ivSize); 
ivAndCipherText.copy(cipherText, 0, ivSize); 

var plaintext = rijndaelEcb.decrypt(cipherText).toString(); 
console.log('Decrypted: ' + plaintext); 

Узел версия производит:

Encrypted: 834aJoVRxla/fGNACUAVFYjihAMWhOLyHllwXptNYB69sHaH+2TtnZXdwbkfZdzc 
Decrypted: This is my password 

Исходя из того, что он расшифрованного оригинальную фразу, я знаю, что звонки работают, как и ожидалось, но шифруется выход не то же самое, что и в PHP скрипт. Логика дешифрования была от this answer, но я больше беспокоюсь о том, чтобы сделать шифрование одинаковым.

Я делаю что-то другое с IV в узле, чем в PHP?

Я посмотрел this question, но он использует модуль crypto вместо модуля mcrypt, который я использую.

ответ

2

Я делаю что-то другое с IV в узле, чем в PHP?

Хм. Что говорит код?

MCRYPT_MODE_ECB,

var rijndaelEcb = new MCrypt('rijndael-128', 'ecb');

Вы используете ECB mode, который не использует IV. Вы фактически тратите впустую процессорные циклы, генерирующие один. Даже если вы использовали режим CBC, MCRYPT_RAND - это плохая константа, которую можно использовать здесь.

var cipherConcat = Buffer.concat([iv, cipher]).toString('base64');

Вы конкатенация неиспользуемого IV к вашему шифротексту, и жалуетесь на недопустимом результате? Код PHP просто возвращает cipher (в эквивалентных условиях Node.js), а не конкатенация iv и cipher.


Что еще более важно, есть некоторые серьезные недостатки криптография здесь, которые должны быть решены, начиная с режима ECB, как упоминалось выше:

  1. Do not encrypt passwords, использовать алгоритм хэширования паролей. There's a huge difference.
  2. Если вы собираетесь шифровать, use authenticated encryption.
  3. Don't use mcrypt.
  4. Не deploy home-grown crypto protocols into production or encourage other developers to do the same.

Рекомендуемые шаги:

  1. дешифрования данных с помощью PHP, а затем хранить пароли properly.
  2. Если вам нужно шифрование для любых других целей, use a high-level cryptography library, как и libsodium.
+0

Спасибо, я мало знаю о криптографии, и код PHP был написан много лет назад кем-то другим, поэтому, к сожалению, мой призыв не измениться. Что касается конкатенации «iv» в версии узла, я видел ее на примере на странице github модуля, поэтому я решил, что это правильно, но все это вместе в версии узла разработано и делает расшифровку намного более чистым , –

+0

Я очень рекомендую поговорить с тем, кто звонит, и попросить их подумать об изменении способа шифрования, чтобы сделать его безопасным. (Если они не знают, как это сделать, я консультируюсь.) –

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