2012-01-05 10 views
19

È necessario crittografare una stringa utilizzando una chiave pubblica (file pem) e quindi firmarla utilizzando una chiave privata (anche un pem).Crittografia dei dati con chiave pubblica in node.js

sto caricando il file PEM bene:

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

ma dopo ore di purga google non riesco a trovare un modo per crittografare i dati utilizzando la chiave pubblica. In PHP ho semplicemente chiamato openssl_public_encrypt, ma non vedo alcuna funzione corrispondente nel nodo o in nessun modulo.

Se qualcuno ha qualche suggerimento, fammi sapere.

risposta

60

nessuna biblioteca amici necessari,

Enter crypto

Ecco un piccolo modulo di janky si potrebbe usare per cifrare/decifrare le stringhe con chiavi 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 = new Buffer(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 = new Buffer(toDecrypt, "base64"); 
    var decrypted = crypto.privateDecrypt(privateKey, buffer); 
    return decrypted.toString("utf8"); 
}; 

module.exports = { 
    encryptStringWithRsaPublicKey: encryptStringWithRsaPublicKey, 
    decryptStringWithRsaPrivateKey: decryptStringWithRsaPrivateKey 
} 

lo consiglio, non utilizzando metodi fs sincroni, ove possibile, e si potrebbe utilizzare promette di rendere questo meglio, ma per un uso semplice casi questo è l'approccio che ho visto lavorare e vorrei prendere

+1

Questo funziona per me ... è meglio andare nativo ... – ATOzTOA

+0

Grazie per la modifica @uzyn –

+0

Grazie per la soluzione @JacobMcKay Mi ha salvato un paio d'ore. – uzyn

7

Che ne dici di questo node-rsa module? Ecco un collegamento allo test.js file that demonstrates usage.

+1

Forse ho bisogno di familiarizzare con la crittografia RSA. Ho letto i documenti su Cripto una dozzina di volte cercando di vedere come fare ciò di cui avevo bisogno, ma non ho trovato nulla. Stai dicendo che createCipheriv() farà quello che mi serve, ma non so nemmeno cosa sia "iv". Immagino sia perché è più astratto in PHP e in altre lingue. Giocherò con quella funzione e vedrò se riesco a farlo funzionare. – Clint

+1

Dopo aver letto ulteriori informazioni su createCipheriv, sembra che non sia crittografia asimmetrica (crittografia a chiave pubblica/privata). Non penso che riempirà i miei bisogni. Crypto ha la possibilità di firmare una stringa crittografata con una chiave privata, il che mi fa chiedere perché non riesco a crittografare usando una chiave pubblica. Sembra strano, oppure mi manca qualcosa completamente. – Clint

+0

iv è un dispositivo di inizializzazione. http://en.wikipedia.org/wiki/Initialization_vector –

8

Il modulo di decodifica e crittografia pubblico/privato aggiornato è URSA. il modulo node-rsa è obsoleto.

Questo modulo Nodo fornisce una serie piuttosto completa di involucri per la RSA pubblica/chiave funzionalità di crittografia privata di OpenSSL.

npm installare Ursa

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

+3

L'Ursa non è stata mantenuta per un po 'di tempo. Queste nuove implementazioni potrebbero aiutare: https://github.com/tracker1/cryptico-js e https://github.com/rzcoder/node-rsa –

3

TL; DR: Ursa è la soluzione migliore. È davvero strano che questo non sia standard con il nodo crittografico.

Tutte le altre soluzioni che ho trovato o non funzionano in Windows o non sono in realtà librerie di crittografia. L'Ursa, raccomandata da Louie, sembra la migliore scommessa. Se non ti interessa di Windows, sei ancora più d'oro. Nota su Ursa, ho dovuto installare Open SSL insieme a qualcosa chiamato "Visual C++ 2008 Redistributables" per far funzionare l'installazione di npm. Ottenere che spazzatura qui: http://slproweb.com/products/Win32OpenSSL.html

La ripartizione:

Questo è letteralmente tutto quello che ho potuto trovare.

+1

node-rsa non si basano più su node-waf. È compatibile con browser. – 131