2012-01-05 65 views
19

我需要使用公钥(pem文件)对字符串进行加密,然后使用私钥(也是pem)对其进行签名。使用公钥在node.js中加密数据

我加载了PEM文件罚款:

publicCert = fs.readFileSync(publicCertFile).toString(); 

但谷歌淘了几个小时之后,我似乎无法找到一种方法使用公钥来加密数据。在PHP中,我只需调用openssl_public_encrypt,但在节点或任何模块中都看不到相应的函数。

如果有人有任何建议,请告诉我。

回答

60

没有图书馆需要的朋友将来的文档,

输入crypto

这里是你可以用它来与RSA密钥加密/解密字符串一个janky的小模块:

var crypto = require("crypto"); 
var path = require("path"); 
var fs = require("fs"); 

var encryptStringWithRsaPublicKey = function(toEncrypt, relativeOrAbsolutePathToPublicKey) { 
    var absolutePath = path.resolve(relativeOrAbsolutePathToPublicKey); 
    var publicKey = fs.readFileSync(absolutePath, "utf8"); 
    var buffer = new Buffer(toEncrypt); 
    var encrypted = crypto.publicEncrypt(publicKey, buffer); 
    return encrypted.toString("base64"); 
}; 

var decryptStringWithRsaPrivateKey = function(toDecrypt, relativeOrAbsolutePathtoPrivateKey) { 
    var absolutePath = path.resolve(relativeOrAbsolutePathtoPrivateKey); 
    var privateKey = fs.readFileSync(absolutePath, "utf8"); 
    var buffer = new Buffer(toDecrypt, "base64"); 
    var decrypted = crypto.privateDecrypt(privateKey, buffer); 
    return decrypted.toString("utf8"); 
}; 

module.exports = { 
    encryptStringWithRsaPublicKey: encryptStringWithRsaPublicKey, 
    decryptStringWithRsaPrivateKey: decryptStringWithRsaPrivateKey 
} 

我建议在可能情况下使用同步fs的方法,你可以使用的承诺,使这更好​​的,但对于简单的使用案例这是我看到的工作方法,并将采取

+1

这对我的作品......这是更好地融入本土... – ATOzTOA 2016-06-07 21:43:23

+0

感谢编辑@uzyn – 2016-09-13 02:53:09

+0

感谢您的解决方案@JacobMcKay救了我一两个小时。 – uzyn 2016-09-13 06:18:07

7

node-rsa module这个怎么样?这是一个链接到test.js file that demonstrates usage

+1

也许我需要更熟悉RSA加密。我十几次阅读加密文档,试图看看如何去做我需要的东西,但我没有找到任何东西。 你说的createCipheriv()会做我需要的,但我甚至不知道“iv”是什么。我想这是因为它在PHP和其他语言中更抽象。我会玩这个功能,看看我能不能把它工作。 – Clint 2012-01-06 07:15:42

+1

在阅读了关于createCipheriv的更多信息之后,它看起来并不是非对称加密(公钥/私钥加密)。我不认为这会满足我的需求。加密确实有能力使用私钥对加密的字符串进行签名,这让我想知道为什么我无法使用公钥进行加密。看起来很奇怪,否则我完全错过了一些东西。 – Clint 2012-01-06 07:25:35

+0

iv是一个初始化函数。 http://en.wikipedia.org/wiki/Initialization_vector – 2012-01-06 14:43:27

8

更新的公共/私人解密和加密模块是URSA。 node-rsa模块已过时。

该节点模块为OpenSSL的RSA公钥/私钥密码功能提供了一套相当完整的包装。

NPM安装大熊

参见:https://github.com/Obvious/ursa

+3

熊族长久以来一直没有维持。这些较新的实现可能有所帮助:https://github.com/tracker1/cryptico-js和https://github.com/rzcoder/node-rsa – 2014-08-20 01:34:25

3

TL; DR:小熊座是你最好的选择。它真的很时髦,这不符合节点加密标准。

我发现的每个其他解决方案都不能在Windows中工作,或者实际上不是加密库。由路易推荐的大熊看起来是最好的选择。如果你不关心窗户,你更加黄金。关于Ursa,我必须安装Open SSL以及一些名为“Visual C++ 2008 Redistributables”的东西,才能使npm install正常工作。这里获取的垃圾:http://slproweb.com/products/Win32OpenSSL.html

细目:

这是字面上我能找到的。

+1

node-rsa不再依赖节点waf。它是浏览器兼容的。 – 131 2015-09-03 06:52:33