Encryption 如何在Node.js中使用公钥加密数据?

Encryption 如何在Node.js中使用公钥加密数据?,encryption,node.js,public-key-encryption,Encryption,Node.js,Public Key Encryption,在crypto中,我只看到签名者/验证者使用对称密钥加密进行数字签名和加密/解密 如何使用公钥加密数据?您可能对我的密码感兴趣。从其API: // Encrypt and sign box(message, nonce, pubkey, privkey) // Decrypt and validate unbox(box, nonce, pubkey, privkey) // Generates a new keypair, returns {private: <buffer>,

在crypto中,我只看到签名者/验证者使用对称密钥加密进行数字签名和加密/解密


如何使用公钥加密数据?

您可能对我的密码感兴趣。从其API:

// Encrypt and sign
box(message, nonce, pubkey, privkey)

// Decrypt and validate
unbox(box, nonce, pubkey, privkey)
// Generates a new keypair, returns {private: <buffer>, public: <buffer>}
boxKeypair()

// Lengths of nonces and public and private keys in bytes
// { nonce: x, pubkey: x, privkey: x }
lengths.box
//加密和签名
框(消息、当前、公钥、私钥)
//解密和验证
取消装箱(箱、暂时、公开密钥、私钥)
//生成新的密钥对,返回{private:,public:}
boxKeypair()
//以字节为单位的nonce以及公钥和私钥的长度
//{nonce:x,publikey:x,privkey:x}
盒子

另一种方法是使用CMS。这不是一个纯粹的Node.js解决方案,但您可能已经准备好了所需的所有工具。下面是使用OpenSSL的示例:

生成x509证书(收件人)和私钥文件(在Bash中):

加密/解密来自标准输入的消息(在Bash中):

您可以使用-in/-out参数来处理文件。下面是一个可用于Node.js的示例:

require('child_process').execSync("openssl cms -encrypt -in file.json -recip cert.pem -out file.json.cms")
在Linux上,您可能已经安装了OpenSSL。您可以通过安装在Windows上获得OpenSSL,但也可以使用内置的PowerShell命令。您需要生成一个证书(使用新的SelfSignedCertificate)或安装现有的证书(也可以使用OpenSSL生成)。在证书存储中安装证书后,可以使用以下命令进行加密/解密:

Protect CmsMessage-to CN=MyCertName-Path file.json-OutFile file.json.cms
取消对CmsMessage-Path file.json的保护#它会在证书存储中为您找到合适的证书
下面是如何使用OpenSSL从同一私钥生成.pem和PFX证书的示例,并使消息在OpenSSL和PowerShell之间可互换

生成带有扩展名的证书(Windows上需要该扩展名):

以上代码片段仅适用于更新版本的OpenSSL(1.1.1)。否则,您需要一个单独的文件来定义扩展名。然后生成一个PFX证书(使用一些密码保护它):

然后将该PFX文件复制到您的Windows计算机。您应该能够通过PowerShell(导入PfxCertificate)或手动(单击它并遵循向导,使用所有默认设置)安装它。为了使消息可互换,在使用OpenSSL时使用
-inform \-outform
参数。例如:

opensslcms-encrypt-in file.json-recip cert.pem-outform pem
opensslcms-decrypt-in file.json.cms-inkey key.pem-通知pem
#如果两个OpenSSL/PowerShell都位于同一操作系统上,请使用此选项进行测试:
echo测试| Protect CmsMessage-to CN=MyCertName | openssl cms-decrypt-notify PEM-inkey key.PEM

顺便说一句,CmsMessage命令将在7.1上提供,因此您也可以在Linux/Mac上使用它(它现在正在预览中,一个稳定的版本将在2020年12月发布)。

谢谢您的回答!虽然此代码可能会提供问题的答案,但建议解释它是如何解决问题的。请更新答案,并解释此代码如何以及为什么解决此问题。尽管您的代码片段可能会解决此问题,但您应该描述代码的用途(它如何解决此问题)。此外,您可能想检查一下,虽然这个代码片段可能是解决方案,但它确实有助于提高文章的质量。记住,你是在回答未来读者的问题,这些人可能不知道你的代码建议的原因。不鼓励只使用代码的答案,因为它们不会为未来的读者提供太多信息。请对你所写的内容提供一些解释。是否有一项研究将遵从性与请求的数量相关联?可能不再有用:是“签名者”、“验证者”,“密码”和“解密”文字?
openssl req  -nodes -new -x509  -keyout key.pem -out cert.pem
 echo 123 | openssl cms -encrypt -recip cert.pem | openssl cms -decrypt -inkey key.pem
require('child_process').execSync("openssl cms -encrypt -in file.json -recip cert.pem -out file.json.cms")
openssl req -x509 -sha256 -nodes -days 365 -newkey rsa:2048 -keyout key.pem -out cert.pem -subj '/CN=MyCertName' -addext extendedKeyUsage=1.3.6.1.4.1.311.80.1 -addext keyUsage=keyEncipherment
openssl pkcs12 -export -out certificate.pfx -inkey key.pem -in cert.pem -passout pass:P@ssw0rd