Я пытаюсь воссоздать функцию шифрования, которую мы имеем в нашем старом 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
, который я использую.
Спасибо, я мало знаю о криптографии, и код PHP был написан много лет назад кем-то другим, поэтому, к сожалению, мой призыв не измениться. Что касается конкатенации «iv» в версии узла, я видел ее на примере на странице github модуля, поэтому я решил, что это правильно, но все это вместе в версии узла разработано и делает расшифровку намного более чистым , –
Я очень рекомендую поговорить с тем, кто звонит, и попросить их подумать об изменении способа шифрования, чтобы сделать его безопасным. (Если они не знают, как это сделать, я консультируюсь.) –