我需要使用公钥(.pem文件)加密字符串,然后使用私钥(也是.pem)对其进行签名。
我可以正常加载.pem文件:
publicCert = fs.readFileSync(publicCertFile).toString();
但经过几个小时的搜索,我似乎找不到一种使用公钥加密数据的方法。在PHP中,我只是调用openssl_public_encrypt(),但在Node.js或任何模块中看不到任何对应的函数。
发布于 2018-12-06 19:35:15
我在Node.js 10中测试了这一点,您可以使用加密/解密函数(Jacob's answer上的小更改):
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)
}
发布于 2012-01-06 13:37:11
使用node-rsa module。这里有一个到test.js file that demonstrates usage的链接。
发布于 2014-09-18 03:34:49
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
https://stackoverflow.com/questions/8750780
复制相似问题