Моя задача — следовать заданному и работающему шифрованию PHP в node.js. используя любые пакеты модулей узлов. Мне не нужно делать расшифровку, потому что она уже существует в их API, и мне просто нужно передать зашифрованное значение в их API для расшифровки, которая находится в PHP. Я попытался использовать node-crypto и отдельный модуль md5. вот псевдокод:
- Data Encryption Algorithm
- Create a 16-byte random salt and hash. The salt is newly created every time you call the API.
- Хэшируйте предоставленный ключ шифрования.
- Зашифруйте с помощью «AES-128-CBC» и используйте хешированное значение соли в качестве вектора и хешированного ключа шифрования.
- Префикс соли и добавьте зашифрованные данные.
- Сделайте кодировку Base64.
- Кодирование JSON и отправка запроса
Я думаю, что я почти сделал всего несколько шагов, чтобы получить успешный ответ, вот мой текущий код node.js
Узел:
const reqBody = {
"username": "jCpVyf3VEt",
"password": "eGD6TWKmnn",
"account_no": "0030300155398",
"tran_date": "08/06/2019 10:30:45",
"reference_no": "12328ALHYGZC20",
"area": "JENRA DAU"
};
const Serialize = require('php-serialize')
const md5 = require('md5');
//encrypt
const crypto = require('crypto'),
algorithm = 'aes-128-cbc',
key = 'IfZDGbVDHTxlJIkK',
inputEncoding = 'utf8',
outputEncoding = 'base64';
function encrypt(data, key) {
let salt = crypto.randomBytes(16);
let hKey = md5(key);
let iv = md5(salt);
let serialized = Serialize.serialize(data);
let cipher = crypto.createCipheriv(algorithm, Buffer.from(hKey, 'hex'), Buffer.from(iv, 'hex'));
let crypted = cipher.update(serialized, inputEncoding, outputEncoding);
crypted += cipher.final(outputEncoding);
let encrypted = salt.toString('base64') + crypted.toString();
return encrypted;
}
encrypt(JSON.stringify(reqBody), key);
вот рабочий php-код:
$data = json_encode([
'username' => "jCpVyf3VEt",
'password' => "eGD6TWKmnn",
'account_no' => "0030300155398",
'tran_date' => "08/06/2019 10:30:45",
'reference_no' => "12328ALHYGZC20",
'area' => "JENRA DAU"]);
function encrypt( $data) {
$key = md5("IfZDGbVDHTxlJIkK", true);
$cipher = "aes-128-cbc";
$salt = openssl_random_pseudo_bytes(16);
$iv = md5( $salt, true);
$encrypted_bin = $salt . openssl_encrypt( serialize( $data ), $cipher, $key, true, $iv);
$encrypted_str = base64_encode( $encrypted_bin);
return $encrypted_str;
}
echo encrypt($data);
для целей тестирования вот код PHP из их API для расшифровки:
$data = 'LI5BJJw1PEhWellnjKEt3g9oaHs8uDDknBT2qDNI7Rfs644+IjobOaFxlrIrOvDm7dkASRsOTu4Yuxzi4I5q29QoE5huH6y4/XZXsResZjLPidv1ToTnhB2UKXH5rX/g/8Od7ljO6VLVAS7zx+94xeOgtpP/idkkpDi1fRNGvnOkl1c6fcyVhwl2Pv+ijKSK9+ou+54dfQrCng2uBzKC6RrHY3lvP7ktsSvtnkXFqksrpjfJ2gnMH6sMIMzru1+D';
function decrypt($encrypted) {
$cipher = "aes-128-cbc";
$key = md5("IfZDGbVDHTxlJIkK", true);
$data = base64_decode($encrypted);
$salt = substr($data, 0, 16);
$iv = md5($salt, true);
$decrypted_bin = openssl_decrypt(substr($data, 16, strlen($data)), $cipher, $key, true, $iv);
if($decrypted_bin === false) {
return json_encode([ -102 => "Authentication Failed"]);
}
return unserialize( $decrypted_bin);
}
echo decrypt($data);
Запуск кода шифрования PHP приводит к успешному ответу от расшифровки PHP. Но когда я запускаю шифрование Node.js, я могу получить зашифрованные данные, но когда я проверяю зашифрованные данные из моего Node.js и отправляю зашифрованное значение в код расшифровки PHP, результатом является ошибка аутентификации. кажется, я не могу перевести алгоритм шифрования PHP в Node.js