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

10

在加密领域,我只知道使用签名者/验证者进行数字签名以及使用对称密钥加密的加密者/解密者。

如何使用公钥加密数据?


"Signer", "Verifier", "Cipher", 和 "Decipher" 是字面意义上的吗? - Peter Mortensen
3个回答

13

如官方的nodejs api文档中所述:crypto.publicEncrypt(key, buffer)

使用密钥key加密buffer的内容,并返回一个包含加密内容的新Buffer。相应的私钥可以用于解密返回的数据,例如使用crypto.privateDecrypt()。

如果key不是KeyObject,则此函数的行为与将key传递给crypto.createPublicKey()相同。如果它是一个对象,则可以传递填充属性。否则,此函数使用RSA_PKCS1_OAEP_PADDING。

因为RSA公钥可以从私钥派生,所以可以传递私钥而不是公钥。

因此答案是:

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

2
是否有一项研究将遵从度与请求数量相关联? - tejasvi88

2

您可能对我的NaCl绑定感兴趣。从其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

1
可能已不再有用:https://blog.chromium.org/2017/05/goodbye-pnacl-hello-webassembly.html - James Moore

0

另一种方法是使用加密消息语法(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。您可以通过安装 Git Bash在Windows上获取OpenSSL,尽管您也可以使用内置的PowerShell命令。您需要生成一个 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月发布)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接