php - 我可以在 NodeJS 中生成 key 对,使用公钥在 PHP 中加密数据,然后在 NodeJS 中解密吗?

标签 php node.js encryption

要求:

本质上,我有一系列设备(运行 NodeJS),需要维护自己唯一的私钥和公钥。它们通过提取内容与 PHP 中的集中服务器进行通信。

当新设备启动时,我希望它生成私钥和公钥,并仅将公钥发送到 PHP 服务器进行存储。

当设备在 PHP 服务器上运行 GET 请求时,服务器应使用提供的公钥来加密数据。

当设备收到此响应时,它应该能够使用私钥来解密此数据。

当前:

我目前正在使用 keypair 生成私钥和公钥对。我将公钥发送到 PHP 服务器进行存储并与唯一设备关联。

我使用 EasyRSA 加密 PHP 服务器上的数据:

$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)

但是它出错了:

解密期间出错(可能是不正确的 key )。

我相信我在这里遗漏了一些基本的东西,但我不确定那可能是什么。有什么想法吗?

最佳答案

EasyRSANodeRSA 不兼容。

EasyRSAPHP Secure Communications Library 的包装器(phpseclib)。它不是纯粹的RSA加密,而是hybrid encryption :RSA用于非对称加密和defuse/php-encryption用于对称加密。 EasyRSA 进行了更详细的描述 heredefuse/php-encryption 在其核心中使用 AES-256-CTR,描述为 here 。发送给收件人的消息除其他内容外还包含使用 RSA 公钥加密的 secret 和使用对称 key 加密的明文,其中每个组件都是 Base64 编码的,并且所有组件都连接在一起,并用 $ 分隔。详细信息可以在EasyRSA加密方法中找到。 -类(class)。一个例子是:

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 端手动完成,工作量可能相对较高(主要任务本质上包括 key 的 RSA 解密、从该 key 导出对称 key ,以及最后的 AES 解密)。由于 NodeRSA 仅涵盖 RSA 部分,因此其余部分需要在 NodeJS 端添加额外的库或自定义代码。

请注意,EasyRSA 页面的 Important 部分警告安全性可能不足。

关于php - 我可以在 NodeJS 中生成 key 对,使用公钥在 PHP 中加密数据,然后在 NodeJS 中解密吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56691877/

相关文章:

grails - Jailspt插件具有grails的加密/解密

java - 后缀和 openJDK 11 : "No appropriate protocol (protocol is disabled or cipher suites are inappropriate)"

node.js - 本地 npm 安装不会创建指向 "bin"可执行文件的符号链接(symbolic link)

node.js - 如何在 Sequelize 中使用外键和常规键创建复合唯一约束?

c# - Entity Framework 和加密数据库

php - Javascript AJAX 函数调用延迟

node.js - 请安装Android目标 "android-19"

php - 如何避免硬编码数据库连接密码?

php - codeigniter 中的 Assets

php - Zend 框架 2 : How do I access modules config value from a controller