webentwicklung-frage-antwort-db.com.de

Verschlüsseln von Daten mit dem öffentlichen Schlüssel in node.js

Ich muss einen String mit einem öffentlichen Schlüssel (PEM-Datei) verschlüsseln und ihn dann mit einem privaten Schlüssel (auch PEM) signieren.

Ich lade die PEM-Dateien gut:

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

aber nach stundenlangem durchsuchen von google kann ich scheinbar keine möglichkeit finden, daten mit dem öffentlichen schlüssel zu verschlüsseln. In PHP rufe ich einfach openssl_public_encrypt auf, sehe aber keine entsprechende Funktion in Node oder in irgendwelchen Modulen.

Wenn jemand Vorschläge hat, lass es mich wissen.

36
Clint

Keine Bibliothek notwendig Freunde,

Geben Sie Krypto ein

Hier ist ein tolles kleines Modul, mit dem Sie Zeichenfolgen mit RSA-Schlüsseln verschlüsseln/entschlüsseln können:

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
}

Ich würde empfehlen, wenn möglich keine synchronen fs-Methoden zu verwenden, und Sie könnten Promises verwenden, um dies zu verbessern, aber für einfache Anwendungsfälle ist dies der Ansatz, den ich bei der Arbeit gesehen habe und verfolgen würde

110
Jacob McKay

Das aktualisierte öffentliche/private Entschlüsselungs- und Verschlüsselungsmodul ist URSA. Node-RSA-Modul ist veraltet.

Dieses Node -Modul bietet einen ziemlich vollständigen Satz von Wrappern für die RSA-Kryptofunktionalität für öffentliche/private Schlüssel von OpenSSL.

npm install ursa

Siehe: https://github.com/Obvious/ursa

8
Louie Miranda

Ich habe dies in Node 10, Sie können Verschlüsselungs-/Entschlüsselungsfunktionen verwenden (kleine Änderungen an Jacobs Antwort)

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)

Für die Schlüssel können Sie diese mit erzeugen

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

Wie wäre es mit diesem Node-RSA-Modul ? Hier ist ein Link zu der test.js-Datei, die die Verwendung demonstriert .

7
Peter Lyons

TL; DR: Ursa ist deine beste Wette. Es ist wirklich irre, dass dies bei Knotenkrypto nicht zum Standard gehört.

Alle anderen Lösungen, die ich gefunden habe, funktionieren entweder nicht in Windows oder sind keine Verschlüsselungsbibliotheken. Ursa, von Louie empfohlen, scheint die beste Wahl zu sein. Wenn Sie sich nicht für Fenster interessieren, sind Sie noch goldener. Hinweis zu Ursa: Ich musste Open SSL zusammen mit "Visual C++ 2008 Redistributables" installieren, damit die npm-Installation funktioniert. Holen Sie sich diesen Müll hier: http://slproweb.com/products/Win32OpenSSL.html

Die Panne:

Das ist buchstäblich alles, was ich finden konnte.

5
B T

Dies wird von Node Version v0.11.13 oder niedriger nicht nativ unterstützt, aber es scheint, dass die nächste Version von Node (a.k.a. v0.12) dies unterstützen wird.

Hier ist der Hinweis: https://github.com/joyent/node/blob/v0.12/lib/crypto.js#L358

sehen crypto.publicEncrypt und crypto.privateDecrypt

Hier ist die zukünftige Dokumentation für diesen https://github.com/joyent/node/blob/7c0419730b237dbfa0ec4e6fb33a99ff01825a8f/doc/api/crypto.markdown#cryptopublicencryptpublic_key-buffer

3
Etienne