Crittografia AES Javascript [chiuso]


109

È disponibile una libreria per la crittografia AES a 256 bit in Javascript?


Ecco cosa ti serve per la crittografia AES utilizzando crypto-js <script src = " cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.2/rollups/… > <script> var encryptedAES = CryptoJS.AES.encrypt ("Messaggio", "Passphrase"); var decrypted = CryptoJS.AES.decrypt (encryptedAES.toString (), "Passphrase"); console.log ("Encrypted:", encryptedAES.toString ()); console.log ( "Decrypted:", decrypted.toString (CryptoJS.enc.Utf8)); </script>
Hari Das

Risposte:


66

JSAES è una potente implementazione di AES in JavaScript. http://point-at-infinity.org/jsaes/


32
JSAES è concesso in licenza con GNU GPL, quindi non è utilizzabile per alcuni progetti.
Robert

11
Questo ora è abbastanza utile e presenta ricco code.google.com/p/crypto-js
David Kierans

2
@HappyDeveloper Beh, no. Non incolpare la licenza per questo. L'autore ha scelto la licenza sbagliata, poiché la GPL non è adatta per le biblioteche.
inta

4
È "gratuito da usare", ma non puoi usarlo se vuoi rilasciare il tuo prodotto risultante sotto qualcosa di diverso dalla GPL.
Curtis

3
JSAES è un buon punto di partenza ma può essere utilizzato solo per crittografare 16 byte di dati. Se vuoi crittografare un blocco di dati più grande, devi estenderlo tu stesso per implementare il vettore di inizializzazione, la modalità di crittografia (CBC o altro ...), il riempimento.
Paolo

35

Ecco una pagina dimostrativa che utilizza slowAES.

slowAES è stato facile da usare. Progettato logicamente. Confezione OO ragionevole. Supporta manopole e leve come IV e modalità di crittografia. Buona compatibilità con .NET / C #. Il nome è ironico; si chiama " slow AES" perché non è implementato in C ++. Ma nei miei test non è stato impraticabilmente lento.

Manca una modalità ECB. Manca anche una modalità CTR, anche se potresti crearne una abbastanza facilmente data una modalità ECB, immagino.

Si concentra esclusivamente sulla crittografia. Una bella classe complementare che esegue la derivazione della chiave basata su password conforme a RFC2898 , in Javascript, è disponibile da Anandam . Questa coppia di librerie funziona bene con le analoghe classi .NET. Buona interoperabilità. Tuttavia, a differenza di SlowAES, Javascript PBKDF2 è notevolmente più lento della classe Rfc2898DeriveBytes durante la generazione delle chiavi.

Non sorprende che tecnicamente ci sia una buona interoperabilità, ma il punto chiave per me è che il modello adottato da SlowAES è familiare e facile da usare. Ho trovato alcune delle altre librerie Javascript per AES difficili da comprendere e utilizzare. Ad esempio, in alcuni di essi non sono riuscito a trovare il posto per impostare l'IV o la modalità (CBC, ECB, ecc.). Le cose non erano come mi aspettavo che fossero. SlowAES non era così. Le proprietà erano esattamente dove mi aspettavo che fossero. È stato facile per me capirlo, avendo familiarità con i modelli di programmazione crittografica Java e .NET.

Il PBKDF2 di Anandam non era esattamente a quel livello. Supportava solo una singola chiamata alla funzione DeriveBytes, quindi se devi derivare sia una chiave che un IV da una password, questa libreria non funzionerà, invariata. Qualche leggera modifica, e funziona perfettamente per quello scopo.

EDIT : ho messo insieme un esempio di impacchettamento di SlowAES e una versione modificata di PBKDF2 di Anandam in Windows Script Components. L'utilizzo di questo AES con una chiave derivata da password mostra una buona interoperabilità con la classe .NET RijndaelManaged.

EDIT2 : la pagina demo mostra come utilizzare questa crittografia AES da una pagina web. L'utilizzo degli stessi input (iv, key, mode, ecc.) Supportati in .NET offre una buona interoperabilità con la classe .NET Rijndael. Puoi fare una "vista sorgente" per ottenere il javascript per quella pagina.

EDIT3
un'aggiunta tardiva: la crittografia Javascript considerata dannosa. Vale la pena leggere.



1
Vedo un caso d'uso valido: l'app HTML 5 in cui tutti i file sono archiviati localmente. Se i file locali possono essere dirottati, allora sei condannato in ogni caso ;-).
Nux

8
riguardo al link edit3, è un pezzo di schifezza di un articolo ... metà delle sue affermazioni sono completamente false!
mmm

2
Il problema della chiave casuale può essere risolto facendo in modo che l'utente muova il mouse e inserisca le chiavi come un vero generatore casuale.
mmm

2
Il collegamento alla pagina di dimostrazione sembra essere interrotto.
Sean

26

Nelle mie ricerche per la crittografia AES ho trovato questo da alcuni studenti di Standford. Sostiene di essere il più veloce là fuori. Supporta CCM, OCB, GCM e crittografia a blocchi. http://crypto.stanford.edu/sjcl/


questo è quello di cui sto parlando!
mmm

5
La documentazione è carente ed è difficile da usare. Come si modifica la lunghezza della chiave? Ho cercato tra i dottori e non sono riuscito a capirlo in un tempo ragionevole. Inoltre, quando si crittografa qualcosa, viene restituito un array di coppie chiave-valore, ma i documenti non sembrano spiegarli. Ho finito per usare la libreria dei tipi mobili.
CpnCrunch

E questo non è asincrono, quindi se stai crittografando o decrittografando una stringa più lunga, ad esempio con AES-CBC, blocca l'interfaccia utente
rsz

12

Google "JavaScript AES" ha trovato diversi esempi. Il primo che è apparso è progettato per spiegare l'algoritmo e fornire una soluzione:

Script di tipo mobile: AES


1
Non riuscivo a capire come impostare la flebo in quella libreria. Inoltre non è molto OO.
Cheeso

L'equivalente dell'IV in modalità contatore è il nonce. Questa implementazione è stata riformulata per essere più OO. Include solo la modalità di funzionamento del contatore (CTR).
ChrisV

Funziona abbastanza bene, tranne per il fatto che non ha alcuna modalità ECB.
CpnCrunch

10

Questo post è ormai vecchio, ma crypto-js potrebbe essere la libreria di crittografia javascript più completa.

CryptoJS è una raccolta di algoritmi crittografici implementati in JavaScript. Include i seguenti cifrari: AES-128, AES-192, AES-256, DES, Triple DES, Rabbit, RC4, RC4Drop e hash: MD5, RIPEMD-160, SHA-1, SHA-256, SHA-512, SHA -3 con 224, 256, 384 o 512 bit.

Potresti voler guardare la loro Guida rapida che è anche il riferimento per la seguente porta node.js.

node-cryptojs-aes è un port node.js di crypto-js


1
Purtroppo manca la documentazione. Sembra avere solo una guida "rapida". Dov'è la documentazione completa? Dice che supporta più lunghezze di chiave, ma nessuna documentazione su come farlo.
CpnCrunch

@CpnCrunch: il documento completo dell'API non è online, ma il codice come commento completo dell'API javadoc. E puoi generarlo. Leggi i commenti sul sorgente cipher-core.js per trovare la dimensione della chiave di cifratura e la dimensione IV del cifrario.
marcz

strano, quando crittografa e
decifro

Ci sono alcuni conflitti a causa dell'uso di openssl
Vlad

9

Recentemente ho avuto la necessità di eseguire una certa interoperabilità di crittografia / decrittografia tra javascript e python.

In particolare ...

1) Utilizzo di AES per crittografare in javascript e decrittografare in python (Google App Engine) 2) Utilizzo di RSA per crittografare in javascript e decrittografare in python (Google App Engine) 3) Utilizzo di pycrypto

Ho trovato tantissime versioni differenti di RSA e AES in giro per il web ed erano tutte diverse nel loro approccio, ma non ho trovato un buon esempio di interoperabilità end-to-end tra javascript e python.

Alla fine sono riuscito a mettere insieme qualcosa che si adattava alle mie esigenze dopo molte prove ed errori.

Ad ogni modo ho fatto un esempio di una js / webapp che parla con un server python ospitato dal motore di app di Google che utilizza AES e chiave pubblica e roba RSA della chiave privata.

Ho pensato di includerlo qui tramite link nel caso in cui possa essere utile ad altri che hanno bisogno di realizzare la stessa cosa.

http://www.ipowow.com/files/aesrsademo.tar.gz

e guarda la demo su rsa-aes-demo DOT appspot DOT com

modifica: guarda l'output della console del browser e visualizza anche la fonte per ottenere alcuni suggerimenti e messaggi utili su cosa sta succedendo nella demo

modifica: aggiornato collegamento molto vecchio e defunto alla fonte a cui ora punta

https://sestertii.com/files/aesrsademo.tar.gz


1
Grazie mille per questo! Per tutta la vita non ho potuto far parlare il mio javascript aes con il mio python aes.
Spike

1
Ho provato tutta la notte (con pycrypto e altri) a fare ciò che il tuo codice mi ha aiutato a realizzare in 10 minuti. Grazie mille!
Remy Vanherweghem

1
Per qualsiasi motivo ho ottenuto che RSA funzionasse facilmente, ma AES è un vero dolore. Grazie per questo!!!
speedplane

1
il collegamento ... non è stato trovato!
macchineaddict

7

A giudicare dalla mia esperienza, asmcrypto.js fornisce l'implementazione AES più veloce in JavaScript (specialmente in Firefox poiché può sfruttare appieno asm.js lì).

Dal readme:

Chrome/31.0
SHA256: 51 MiB/s (9 times faster than SJCL and CryptoJS)
AES-CBC: 47 MiB/s (13 times faster than CryptoJS and 20 times faster than SJCL)

Firefox/26.0
SHA256: 144 MiB/s (5 times faster than CryptoJS and 20 times faster than SJCL)
AES-CBC: 81 MiB/s (3 times faster than CryptoJS and 8 times faster than SJCL)

Modifica: l' API di crittografia Web è ora implementata nella maggior parte dei browser e dovrebbe essere utilizzata come soluzione principale se si ha a cuore le prestazioni. Tieni presente che IE11 ha implementato una versione precedente della bozza dello standard che non utilizzava le promesse.

Alcuni esempi possono essere trovati qui:


Ricevo circa 8 MiB / s con CryptoJS. Mi chiedo come funzionerebbe.
Lodewijk


3

Prova asmcrypto.js : è davvero veloce.

PS: sono un autore e posso rispondere alle tue domande se ce ne sono. Inoltre sarei felice di ricevere un feedback :)


asmcrypto.js è carino, ma su IE10 non funziona bene. si blocca il browser per più di 1 minuto a volte, o almeno 45 secondi. Inoltre, non ho capito, perché è necessario sostituire la funzione matematica globale? ci sono molte biblioteche che usano questa.
decho

2
Potresti commentare come sei sicuro che funzioni correttamente? IOW: Come fai a sapere di aver implementato correttamente AES?
Lodewijk

Le prestazioni di IE10 sono scarse perché non ottimizza affatto asm.js. Inoltre ha modelli JIT leggermente diversi. Far funzionare bene il codice in IE fa schifo anche in Chrome e FF. Supponiamo che io abbia fatto la scelta giusta. Per quanto riguarda Math.random c'è stata una lunga discussione . In breve, questa esigenza di prevenzione della perdita di output casuale di Math.random (che in teoria potrebbe degradare la sicurezza di PRNG).
vibornoff



1

Se stai cercando di utilizzare javascript per evitare di utilizzare SSL, ripensaci. Esistono molte misure a metà strada, ma solo SSL fornisce comunicazioni sicure. Le librerie di crittografia Javascript possono aiutare contro un certo insieme di attacchi, ma non un vero attacco man-in-the-middle.

Se stai cercando SSL per Google App Engine su un dominio personalizzato, dai un'occhiata a wwwizer.com .

Il seguente post spiega come creare tentativi di comunicazione sicura con javascript e come sbagliarli: utilizzare il modulo di crittografia JavaScript invece di SSL / HTTPS


1
Non sono sicuro del motivo per cui questo è stato votato all'oblio, in quanto è un ottimo punto che chiunque pensi di implementare la crittografia javascript deve almeno considerare. Upvoted.
Jules

Usare la crittografia lato client per evitare SSL è un vecchio punto a cui alcuni dicono di andare contro di esso: infatti può aggiungere sicurezza a HTTPS, evitando attacchi passivi, o essere utilizzato in applicazioni scaricate ed estensioni del browser. Ho visto solo una volta che veniva usato in modo sbagliato (il mio college, ma l'hanno già risolto) e molte volte usato correttamente (cryptocat, ad esempio).
Gustavo Rodrigues



Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.