首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在Node.js中使用公钥加密数据

在Node.js中使用公钥加密数据
EN

Stack Overflow用户
提问于 2012-01-06 06:26:44
回答 4查看 98.1K关注 0票数 50

我需要使用公钥(.pem文件)加密字符串,然后使用私钥(也是.pem)对其进行签名。

我可以正常加载.pem文件:

代码语言:javascript
复制
publicCert = fs.readFileSync(publicCertFile).toString();

但经过几个小时的搜索,我似乎找不到一种使用公钥加密数据的方法。在PHP中,我只是调用openssl_public_encrypt(),但在Node.js或任何模块中看不到任何对应的函数。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2015-06-26 05:46:30

库不是必需的。输入crypto

这是一个简陋的小模块,你可以用它来加密/解密带有RSA密钥的字符串:

代码语言:javascript
复制
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来改进这一点,但对于简单的用例,这是我所见过并将采取的方法。

票数 143
EN

Stack Overflow用户

发布于 2018-12-06 19:35:15

我在Node.js 10中测试了这一点,您可以使用加密/解密函数(Jacob's answer上的小更改):

代码语言:javascript
复制
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)

对于您可以用来生成它们的密钥

代码语言:javascript
复制
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)
}
票数 28
EN

Stack Overflow用户

发布于 2012-01-06 13:37:11

使用node-rsa module。这里有一个到test.js file that demonstrates usage的链接。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8750780

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档