我已经成功加载了.pem文件:
publicCert = fs.readFileSync(publicCertFile).toString();
但是经过数小时的在Google上搜索后,我似乎找不到一种使用公钥加密数据的方法。在PHP中,我只需要调用 openssl_public_encrypt()
函数,但是我在Node.js或任何模块中都没有看到相应的函数。
publicCert = fs.readFileSync(publicCertFile).toString();
但是经过数小时的在Google上搜索后,我似乎找不到一种使用公钥加密数据的方法。在PHP中,我只需要调用 openssl_public_encrypt()
函数,但是我在Node.js或任何模块中都没有看到相应的函数。
不需要使用库。输入crypto。
以下是一个有点瑕疵的小模块,您可以使用RSA密钥加密/解密字符串:
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 = Buffer.from(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 = Buffer.from(toDecrypt, "base64");
var decrypted = crypto.privateDecrypt(privateKey, buffer);
return decrypted.toString("utf8");
};
module.exports = {
encryptStringWithRsaPublicKey: encryptStringWithRsaPublicKey,
decryptStringWithRsaPrivateKey: decryptStringWithRsaPrivateKey
}
我建议尽可能不使用同步的fs方法,可以使用promises来改进,但对于简单的用例,这是我见过的可行的方法。
我在Node.js 10中测试了这个,你可以使用加密/解密函数(在Jacob的回答上进行小修改):
const crypto = require('crypto')
const path = require('path')
const fs = require('fs')
function encrypt(toEncrypt, relativeOrAbsolutePathToPublicKey) {
const absolutePath = path.resolve(relativeOrAbsolutePathToPublicKey)
const publicKey = fs.readFileSync(absolutePath, 'utf8')
const buffer = Buffer.from(toEncrypt, 'utf8')
const encrypted = crypto.publicEncrypt(publicKey, buffer)
return encrypted.toString('base64')
}
function decrypt(toDecrypt, relativeOrAbsolutePathtoPrivateKey) {
const absolutePath = path.resolve(relativeOrAbsolutePathtoPrivateKey)
const privateKey = fs.readFileSync(absolutePath, 'utf8')
const buffer = Buffer.from(toDecrypt, 'base64')
const decrypted = crypto.privateDecrypt(
{
key: privateKey.toString(),
passphrase: '',
},
buffer,
)
return decrypted.toString('utf8')
}
const enc = encrypt('hello', `public.pem`)
console.log('enc', enc)
const dec = decrypt(enc, `private.pem`)
console.log('dec', dec)
您可以使用以下方法生成密钥:
const { writeFileSync } = require('fs')
const { generateKeyPairSync } = require('crypto')
function generateKeys() {
const { privateKey, publicKey } = generateKeyPairSync('rsa', {
modulusLength: 4096,
publicKeyEncoding: {
type: 'pkcs1',
format: 'pem',
},
privateKeyEncoding: {
type: 'pkcs1',
format: 'pem',
cipher: 'aes-256-cbc',
passphrase: '',
},
})
writeFileSync('private.pem', privateKey)
writeFileSync('public.pem', publicKey)
}
使用node-rsa模块。这里是一个链接,指向演示用的test.js文件。
我发现其他所有解决方案都无法在Windows上运行,或者实际上并不是加密库。Louie推荐的URSA看起来是最好的选择。如果您不关心Windows,那么您就更加完美。
关于Ursa的注意事项:为了使npm安装正常工作,我必须安装OpenSSL以及称为“Visual C++ 2008 Redistributables”的东西。在此获取该垃圾:http://slproweb.com/products/Win32OpenSSL.html
分解:
非加密库
这就是我能找到的全部内容。
Node.js版本v0.11.13或更低版本不支持此功能,但是下一个版本的Node.js(即v0.12)将支持此功能。
以下是提示:https://github.com/joyent/node/blob/v0.12/lib/crypto.js#L358
请查看crypto.publicEncrypt
和crypto.privateDecrypt
openssl rsa -in ~/.ssh/id_rsa -outform pem > id_rsa.pem
- Bodhi Hu