Cli*_*int 36 encryption-asymmetric public-key-encryption node.js
我需要使用公钥(pem文件)加密字符串,然后使用私钥(也是pem)对其进行签名.
我正在加载pem文件:
publicCert = fs.readFileSync(publicCertFile).toString();
Run Code Online (Sandbox Code Playgroud)
但经过几个小时的谷歌搜索后,我似乎找不到使用公钥加密数据的方法.在php中我只是调用openssl_public_encrypt,但我没有在节点或任何模块中看到任何相应的函数.
如果有人有任何建议,请告诉我.
Jac*_*Kay 114
没有图书馆必备的朋友
输入加密
这是一个janky little module,可用于使用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
}
Run Code Online (Sandbox Code Playgroud)
我建议尽可能不使用同步fs方法,你可以使用Promises来改善它,但对于简单的用例,这是我见过的工作方法
Bru*_*oLM 10
我在节点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)
Run Code Online (Sandbox Code Playgroud)
对于密钥,您可以使用
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)
}
Run Code Online (Sandbox Code Playgroud)
更新的公共/私有解密和加密模块是URSA.node-rsa模块已过时.
此Node模块为OpenSSL的RSA公钥/私钥加密功能提供了一套相当完整的包装器.
npm安装ursa
请参阅:https://github.com/Obvious/ursa
TL; DR:Ursa是您最好的选择。真的很奇怪,这不是节点加密的标准配置。
我发现的所有其他解决方案都不能在Windows中运行,或者实际上不是加密库。路易(Louie)推荐的Ursa看起来是最好的选择。如果您不关心Windows,那么您甚至会更上一层楼。关于Ursa的注意事项,为了使npm安装正常工作,我必须安装Open SSL以及称为“ Visual C ++ 2008 Redistributables”的东西。在此处获取该垃圾:http : //slproweb.com/products/Win32OpenSSL.html
细目:
这就是我所能找到的全部。
| 归档时间: |
|
| 查看次数: |
62917 次 |
| 最近记录: |