#php #json #node.js #encryption #phpseclib
#php #json #node.js #шифрование #phpseclib
Вопрос:
У меня небольшая проблема, поскольку я хочу зашифровать некоторые данные post, которые я получаю из формы, а затем отправить их на мой сервер nodejs в формате json, чтобы поместить их в базу данных.
Моя проблема: кажется, я не могу опубликовать данные после их шифрования. Я могу опубликовать строку json просто отлично, но не более того:
Мой код:
$rsa->loadKey($keydata);
$rsa->setEncryptionMode(CRYPT_RSA_ENCRYPTION_PKCS1);
$encrypted = $rsa->encrypt("test");
$jsonArray = array(
'crypt' => $encrypted
);
$jsonArrayEncoded = json_encode($jsonArray);
echo $jsonArrayEncoded;
$ch = curl_init('https://..........');
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json'));
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $jsonArrayEncoded);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$response = json_decode(curl_exec($ch), true);
curl_close($ch);
Я даже не получаю вывод echo. Но строка, похоже, зашифровывается, поскольку я могу повторить это (множество ошибок кодировки несколько случайных букв и цифр), и если я расшифрую ее в php skript, я также получу правильный результат. Я не получаю никаких консольных предупреждений или ошибок ни в Chrome, ни в Firefox.
Я что-нибудь делаю не так? (совершенно уверен, что есть)
e: Я использую это как криптографическую библиотеку:http://phpseclib.sourceforge.net/rsa/examples.html#encrypt,enc1
правка2: ну, как и советовалось в комментариях, я преобразовал строку в utf8, но теперь она кажется слишком длинной для расшифровки моим ключом… Tough o зашифровал только слово «test»…
Я думаю, что мне нужно копнуть глубже…
Если кто-нибудь знает: для расшифровки я использую модуль Ursa для node.js с помощью следующего кода:
var buffer = new Buffer(req.body.crypt);
var data = private.decrypt(buffer, 'utf8', 'utf8', ursa.RSA_PKCS1_PADDING);
Комментарии:
1. Может быть проблема с кодировкой, вы пробовали применять
utf8_encode()
между шифрованием и json’ing?2. Поскольку я не знал, что функции нет… но вроде как это сработало…
3. Что вы подразумеваете под «слишком длинным для расшифровки»? Очевидно, что вы бы декодировали перед расшифровкой — поэтому для процесса шифрования кодировка вообще не должна иметь никакого значения
4. Да, все еще я получаю ошибку «длиннее, чем modlen» при попытке декодировать ее с помощью ursa… Я выбрал один и тот же метод заполнения для обоих, поэтому я думаю, что есть другая проблема, на которую я посмотрю завтра.
Ответ №1:
что ж, как было указано в комментариях, я преобразовал строку в utf8, но теперь она кажется слишком длинной для расшифровки моим ключом… Tough o зашифровал только слово «test»…
Было бы полезно увидеть ваш обновленный код, который это делает. Вместо этого…
json_encode изначально не обрабатывает двоичные данные. Моей рекомендацией было бы сделать что-то вроде этого:
$jsonArray = array(
'crypt' => bin2hex($encrypted)
);
$jsonArrayEncoded = json_encode($jsonArray);
echo $jsonArrayEncoded;
Однако вам нужно будет сжать ее обратно в двоичный файл после того, как вы декодируете json в Java.
В качестве альтернативы, вы могли бы выполнить base64_encode, а base64 декодировать его позже.
Проблема, которую я бы испытал с кодировкой utf8, заключается в том, что внутренний строковый тип PHP не является utf8. Если Java, то, похоже, это может вызвать проблемы.
Комментарии:
1. Я попробую это позже. Мой код на данный момент не сильно изменился, я просто добавил один utf8_encode () перед json_encode() , хотя я могу опубликовать и это позже.
Ответ №2:
Функция json_encoding имеет множество флагов, которые вы можете передать ей, которые позволяют функции анализировать определенные наборы символов. Следующий вызов может решить возникающие у вас проблемы
json_encode($jsonArray, JSON_UNESCAPED_SLASHES | JSON_HEX_APOS | JSON_HEX_QUOT | JSON_HEX_AMP );
Комментарии:
1. Извините, ничего из этого не помогло : ( как указано выше, преобразование строки в utf8 помогло.
2. ОК. В любом случае, это стоит знать на будущее. Удачи с вашим проектом