Могу ли я сгенерировать пару ключей в NodeJS, зашифровать данные в PHP с помощью открытого ключа и расшифровать в NodeJS? - PullRequest
1 голос
/ 20 июня 2019

Требования:

По сути, у меня есть серия устройств (под управлением NodeJS), которые должны поддерживать свои собственные уникальные закрытые и открытые ключи. Они связываются с централизованным сервером в PHP, вытягивая контент.

Когда запускается новое устройство, я хотел бы, чтобы оно генерировало закрытый и открытый ключ и отправляло только открытый ключ на сервер PHP для хранения.

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

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

В настоящее время:

В настоящее время я генерирую пару личного и открытого ключей, используя keypair . Я отправляю открытый ключ на сервер PHP, чтобы сохранить его и связать с уникальным устройством.

Я шифрую данные на PHP-сервере, используя EasyRSA :

$message = "Decrypt me if you can";
$publicKey = new PublicKey($storedPublicKey);
$encrypted = EasyRSA::encrypt($message, $publicKey);
return $encrypted;

Когда эта зашифрованная строка возвращается в приложение NodeJS, я пытаюсь расшифровать ее, используя NodeRSA (где response - строковый ответ от сервера PHP):

const key = new NodeRSA(storedPrivateKey)
const result = key.decrypt(response)

Однако это приводит к ошибкам:

Error during decryption (probably incorrect key).

Я полагаю, что мне здесь не хватает чего-то фундаментального, но я не уверен, что это может быть. Есть мысли?

1 Ответ

0 голосов
/ 24 июня 2019

EasyRSA и NodeRSA несовместимы.

EasyRSA - это оболочка для PHP Secure CommunicationsБиблиотека ( phpseclib ).Это не просто шифрование RSA, а гибридное шифрование : RSA используется для асимметричного шифрования и defuse / php-encryption для симметричного шифрования. EasyRSA описано более подробно здесь , defuse / php-шифрование использует AES-256-CTR в своей основе и описано здесь ,Сообщение для получателя содержит, помимо прочего, секрет, зашифрованный с помощью открытого ключа RSA, и открытый текст, зашифрованный с помощью симметричного ключа, где каждый компонент закодирован в Base64, а все компоненты объединены, разделены $.Подробности можно найти в encrypt -методе EasyRSA -класса.Например:

EzR2$D6rpL1QleeNLWhqj27VZf/nyyau6i0AIWyGR0G/2Z8tLDp5VbrcIrg9hROG6MMSH1+SLHKyU45+P+V2LAgm7pSnsi3rxVmHnfCXVYIuZDvzpov520tFa5IWHtvFDKCKzckDcJmI3g50RGShDXuYGCPpDy1XpSoP3dGMfkf9Dsj+Y6YLrFwEACoS16azfQ9iiWr7yK2xx66OHAzZqIDyxNRJS3jJUVrcykSkpx4fSgplaKf36yRGoApNXR6/m8CyBpHw3GWe3GMLZi33nmW0DOGTK/eJZJII7Xx7k6nThU1t4thKyvNLIp2JYaUMmYmvwD3R7D3X++twDhTp77hEMfAe0eaVC6P2mAa8I2zIpqlqnqHslXUpqwUxgwaULJSlQiaBex2U1e75onaHu9UDLjV/VK7jgiYgdwq5psHEC4Ig+Xj183mMS8+hWGLHUiLaC+/zcliZaNKYuBihZg9kn7fAwlmgUZT671+bvHONYaDgQg9ULd5QBYlalVIU3BZZPKgvYjk+aLgljv+sExhUmvudWe0FQQGbgLncC8rx7xJzRHMq4qpKgKYtp49b5Gk0OrRYfukQsY9fIc/4m7y67oPBYhJCOSqR0P5YFA9W7wx2C4gpZaYYq0LOAbcNXtfn4QZ8gpxhytQQ0c/Scus0jN8UyOgx8FWF1zlXc7Cu4UAk=$3vUCABOzsE0AWMMPy+EWtmAQheAq5oYVfOF7TapT1LoFn72UHbYNjpD2LgG7w6ZCQjRtLFzFZc17Ntme/LvWK97cV1+mOIpk+j6V6WHZRbwb36iBTGhACZUFTMPiSLPfTXJRu+tQkwi8$2f933da952b7c683

Такое сообщение не может быть дешифровано напрямую NodeRSA , поскольку NodeRSA ожидает чистого сообщения RSA.В принципе, расшифровка возможна, но ее придется выполнять вручную на стороне NodeJS, возможно, с относительно большими усилиями (основные задачи, в основном, включают расшифровку RSA секрета, вывод симметричного ключа из этого секрета и, наконец,Расшифровка AES).Поскольку NodeRSA охватывает только часть RSA, остальные части требуют дополнительных библиотек или специального кода на стороне NodeJS.

Обратите внимание, что страница EasyRSA , раздел Важно предупреждает о возможной недостаточной безопасности.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...