È disponibile una libreria per la crittografia AES a 256 bit in Javascript?
È disponibile una libreria per la crittografia AES a 256 bit in Javascript?
Risposte:
JSAES è una potente implementazione di AES in JavaScript. http://point-at-infinity.org/jsaes/
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.
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/
Google "JavaScript AES" ha trovato diversi esempi. Il primo che è apparso è progettato per spiegare l'algoritmo e fornire una soluzione:
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
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
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:
Usa CryptoJS
Ecco il codice: https://github.com/odedhb/AES-encrypt
Ed ecco un esempio funzionante online: https://odedhb.github.io/AES-encrypt/
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 :)
La libreria http://www.mohable-type.co.uk/scripts/aes.html può essere di qualche aiuto.
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
C'è anche una lib gratuita di Stanford come alternativa a Cryptojs
Un'altra soluzione con supporto AES-256: https://github.com/digitalbazaar/forge
Ecco l'unica soluzione che ha funzionato per me:
http://www.hanewin.net/encrypt/aes/aes.htm
È piuttosto semplice, ma semplice da usare e sembra funzionare bene.