使用node.js中的公钥加密数据

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来改善它,但对于简单的用例,这是我见过的工作方法

  • 值得一提的是,您只能使用公钥加密少量(最多245个字节)的数据,对于较大的数量,您应该使用AES256和使用公私对加密的私钥.请参阅以下答案:https://security.stackexchange.com/questions/33434/rsa-maximum-bytes-to-encrypt-comparison-to-aes-in-terms-of-security (5认同)

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)


Lou*_*nda 8

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

此Node模块为OpenSSL的RSA公钥/私钥加密功能提供了一套相当完整的包装器.

npm安装ursa

请参阅:https://github.com/Obvious/ursa

  • Ursa已经维持了很长一段时间.这些较新的实现可能有所帮助:https://github.com/tracker1/cryptico-js和https://github.com/rzcoder/node-rsa (3认同)

Pet*_*ons 7

这个node-rsa模块怎么样?这是一个演示用法test.js文件的链接.


B T*_*B T 5

TL; DR:Ursa是您最好的选择。真的很奇怪,这不是节点加密的标准配置。

我发现的所有其他解决方案都不能在Windows中运行,或者实际上不是加密库。路易(Louie)推荐的Ursa看起来是最好的选择。如果您不关心Windows,那么您甚至会更上一层楼。关于Ursa的注意事项,为了使npm安装正常工作,我必须安装Open SSL以及称为“ Visual C ++ 2008 Redistributables”的东西。在此处获取该垃圾:http : //slproweb.com/products/Win32OpenSSL.html

细目:

这就是我所能找到的全部。