在Node.js的公钥对数据进行加密

问题描述 投票:34回答:6

我需要加密使用公钥(PEM文件)的字符串,然后使用私有密钥(也PEM)签字。

我加载了PEM文件罚款:

publicCert = fs.readFileSync(publicCertFile).toString();

但谷歌的冲刷小时后,我似乎无法找到一种方法,使用公钥对数据进行加密。在PHP中我只需拨打openssl_public_encrypt,但我没有看到节点或在任何模块的任何相应的功能。

如果任何人有任何建议,让我知道。

node.js public-key-encryption encryption-asymmetric
6个回答
110
投票

没有必要库的朋友,

输入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 = 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的方法,你可以使用的承诺,使这更好​​的,但对于简单的用例,这是我所看到的工作,并会采取的方法


8
投票

更新后的公钥/私钥解密和加密模块URSA。节点-RSA模块已过时。

该节点模块提供了一整套较为完善的包装为RSA公钥/私钥加密的OpenSSL的功能。

翔升安装大熊

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


7
投票

这个怎么样node-rsa module?下面是对test.js file that demonstrates usage的链接。


7
投票

我在10节点测试这一点,您可以使用加密/解密(雅各的回答微小变化)功能

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)
}

5
投票

TL; DR:小熊座是你最好的选择。它很大胆,这不来与节点加密标准。

每一个其他的解决方案,我发现要么不工作在Windows或不实际的加密库。大雄宝殿,由路易建议,看起来是最好的选择。如果你不关心的窗户,你甚至更多的金。注意在大熊座,我不得不用的东西,以获得故宫安装工作被称为“VISUAL C ++ 2008年可再发行组件”一起安装Open SSL。这里获取的垃圾:http://slproweb.com/products/Win32OpenSSL.html

故障:

这是字面上所有我能找到。


3
投票

这不是由节点版v0.11.13或低于原生支持,但似乎节点(a.k.a v0.12)的下一版本将支持这一点。

这里是线索:https://github.com/joyent/node/blob/v0.12/lib/crypto.js#L358

看到crypto.publicEncryptcrypto.privateDecrypt

下面是该https://github.com/joyent/node/blob/7c0419730b237dbfa0ec4e6fb33a99ff01825a8f/doc/api/crypto.markdown#cryptopublicencryptpublic_key-buffer未来的文档

© www.soinside.com 2019 - 2024. All rights reserved.