2012-01-05 73 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