Шифрование данных с помощью открытого ключа в node.js - PullRequest
36 голосов
/ 06 января 2012

Мне нужно зашифровать строку с помощью открытого ключа (файл pem), а затем подписать ее с помощью закрытого ключа (также pem).

Я загружаю pem-файлы нормально:

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

, но после нескольких часов поисков в Google я не могу найти способ шифрования данных с помощью открытого ключа.В php я просто вызываю openssl_public_encrypt, но я не вижу соответствующей функции в узле или в каких-либо модулях.

Если у кого-нибудь есть предложения, дайте мне знать.

Ответы [ 6 ]

108 голосов
/ 26 июня 2015

Нет необходимости в библиотеке, друзья,

Введите crypto

Вот небольшой модуль, который вы можете использовать для шифрования / дешифрования строк с помощью ключей 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
}

Я бы порекомендовал не использовать синхронные методы fs там, где это возможно, и вы могли бы использовать Promises, чтобы сделать это лучше, но для простых случаев использования этот подход, который я видел в работе, занял бы

8 голосов
/ 09 июля 2013

Обновленный публичный / приватный модуль дешифрования и шифрования - URSA.Модуль node-rsa устарел.

Этот Node-модуль предоставляет довольно полный набор оболочек для криптографической функциональности открытого / секретного ключа RSA OpenSSL.

npm install ursa

См .: https://github.com/Obvious/ursa

7 голосов
/ 06 января 2012
6 голосов
/ 06 декабря 2018

Я проверял это в Узле 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)
}
4 голосов
/ 10 июля 2013

TL; DR: Ursa - ваш лучший выбор.Действительно забавно, что это не входит в стандартную комплектацию узла crypto.

Все остальные найденные мной решения либо не работают в Windows, либо на самом деле не являются библиотеками шифрования.Ursa, рекомендованный Луи, выглядит лучшим выбором.Если вы не заботитесь об окнах, вы еще более золотые.Обратите внимание на Ursa, я должен был установить Open SSL вместе с чем-то, называемым «Visual C ++ 2008 Redistributables», чтобы заставить работать установку npm.Получите этот мусор здесь: http://slproweb.com/products/Win32OpenSSL.html

Разбивка:

Это буквально все, что я смог найти.

2 голосов
/ 17 сентября 2014

Это не поддерживается изначально версией узла v0.11.13 или ниже, но кажется, что следующая версия узла (a.k.a v0.12) будет поддерживать это.

Вот подсказка: https://github.com/joyent/node/blob/v0.12/lib/crypto.js#L358

см. crypto.publicEncrypt и crypto.privateDecrypt

Вот будущая документация для этого https://github.com/joyent/node/blob/7c0419730b237dbfa0ec4e6fb33a99ff01825a8f/doc/api/crypto.markdown#cryptopublicencryptpublic_key-buffer

...