如何使用NodeJS中的公钥加密数据?

时间:2011-10-15 16:45:40

标签: encryption node.js public-key-encryption

在加密中,我只看到Signer / Verifier用于进行数字签名,并且使用对称密钥加密进行密码/解密。

如何使用公钥加密数据?

4 个答案:

答案 0 :(得分:8)

对于那些在谷歌搜索时遇到这个问题的人,另一个问题已经回答了Encrypting data with Public Key in node.js这个问题很有效。

答案 1 :(得分:2)

您可能对我的NaCl bindings感兴趣。来自其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

答案 2 :(得分:2)

var encrypted = crypto.publicEncrypt(publicKey, buffer);

答案 3 :(得分:0)

另一种方法是使用Cryptographic Message Syntax(CMS)。这不是一个纯粹的Node.js解决方案,但是您可能会在框中找到所需的所有工具。下面是使用OpenSSL的示例:

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

openssl req  -nodes -new -x509  -keyout key.pem -out cert.pem

通过标准输入(以Bash格式)加密/解密消息:

 echo 123 | openssl cms -encrypt -recip cert.pem | openssl cms -decrypt -inkey key.pem

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

require('child_process').execSync("openssl cms -encrypt -in file.json -recip cert.pem -out file.json.cms")

在Linux上,您可能已经安装了OpenSSL。尽管您也可以使用内置的PowerShell命令,但是可以通过安装Git Bash在Windows上获得OpenSSL。您将需要生成PFX证书(使用 New-SelfSignedCertificate )或安装现有证书(也可以使用OpenSSL生成)。将证书安装到证书存储区后,您可以使用以下命令进行加密/解密:

Protect-CmsMessage -to CN=MyCertName -Path file.json -OutFile file.json.cms
Unprotect-CmsMessage -Path file.json # It will find proper cert in cert store for you

下面是一个示例,说明如何使用OpenSSL从同一私钥生成.pem和PFX证书,并使消息在OpenSSL和PowerShell之间可互换。

生成带有扩展名的证书(在Windows中是必需的):

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的较新版本(1.1.1)。否则,您需要一个单独的文件来定义扩展名。然后生成一个PFX证书(用一些密码保护它):

openssl pkcs12 -export -out certificate.pfx -inkey key.pem -in cert.pem -passout pass:P@ssw0rd

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

openssl cms -encrypt -in file.json -recip cert.pem -outform PEM 
openssl cms -decrypt -in file.json.cms -inkey key.pem -inform PEM
# If having both OpenSSL/PowerShell on the same OS, use this for testing:
echo test | Protect-CmsMessage -to CN=MyCertName | openssl cms -decrypt -inform PEM -inkey key.pem

顺便说一句,CmsMessage命令将在PowerShell Core 7.1上可用,因此您也可以在Linux / Mac上使用它(现在处于预览状态,稳定版本将于2020年12月发布)。