Javascript AES-Verschlüsselung [geschlossen]

109

Gibt es eine Bibliothek für die AES-256-Bit-Verschlüsselung in Javascript?

Codierer
quelle
Folgendes benötigen Sie für die AES-Verschlüsselung mit crypto-js <script src = " cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.2/rollups/… > <script> var encryptedAES = CryptoJS.AES.encrypt ("Nachricht", "Passphrase"); var decrypted = CryptoJS.AES.decrypt (encryptedAES.toString (), "Passphrase"); console.log ("Encrypted:", encryptedAES.toString ()); console.log ( "Entschlüsselt:", decrypted.toString (CryptoJS.enc.Utf8)); </ script>
Hari Das

Antworten:

66

JSAES ist eine leistungsstarke Implementierung von AES in JavaScript. http://point-at-infinity.org/jsaes/

Backslash17
quelle
32
JSAES ist unter der GNU GPL lizenziert - daher kann es für einige Projekte nicht verwendet werden.
Robert
11
Dies ist jetzt sehr nützlich und bietet reichhaltigen Code.google.com/p/crypto-js
David Kierans
2
@ HappyDeveloper Nun, nein. Machen Sie die Lizenz nicht dafür verantwortlich. Der Autor hat die falsche Lizenz gewählt, da die GPL nicht für Bibliotheken geeignet ist.
Inta
4
Es ist "kostenlos zu verwenden", aber Sie können es nicht verwenden, wenn Sie Ihr resultierendes Produkt unter einer anderen als der GPL veröffentlichen möchten.
Curtis
3
JSAES ist ein guter Ausgangspunkt, kann jedoch nur zum Verschlüsseln von 16 Datenbytes verwendet werden. Wenn Sie einen größeren Datenblock verschlüsseln möchten, müssen Sie ihn selbst erweitern, um den Intialisierungsvektor, den Verschlüsselungsmodus (CBC oder andere ...) und das Auffüllen zu implementieren.
Paolo
35

Hier ist eine Demonstrationsseite , die slowAES verwendet.

slowAES war einfach zu bedienen. Logisch gestaltet. Angemessene OO-Verpackung. Unterstützt Knöpfe und Hebel wie IV und Verschlüsselungsmodus. Gute Kompatibilität mit .NET / C #. Der Name ist ironisch; Es heißt " langsames AES", weil es nicht in C ++ implementiert ist. Aber in meinen Tests war es nicht unpraktisch langsam.

Es fehlt ein EZB-Modus. Es fehlt auch ein CTR-Modus, obwohl man mit einem EZB-Modus ziemlich einfach einen erstellen könnte, denke ich.

Es konzentriert sich ausschließlich auf die Verschlüsselung. Eine nette ergänzende Klasse, die eine RFC2898 - konforme kennwortbasierte Schlüsselableitung in Javascript durchführt, ist bei Anandam erhältlich . Dieses Bibliothekspaar funktioniert gut mit den analogen .NET-Klassen. Gutes Interop. Im Gegensatz zu SlowAES ist das Javascript PBKDF2 beim Generieren von Schlüsseln jedoch deutlich langsamer als die Rfc2898DeriveBytes- Klasse.

Es ist nicht überraschend, dass es technisch gesehen ein gutes Interop gibt, aber der entscheidende Punkt für mich war, dass das von SlowAES übernommene Modell vertraut und einfach zu bedienen ist. Ich fand einige der anderen Javascript-Bibliotheken für AES schwer zu verstehen und zu verwenden. Zum Beispiel konnte ich in einigen von ihnen weder den Ort zum Einstellen der IV noch den Modus (CBC, EZB usw.) finden. Die Dinge waren nicht dort, wo ich sie erwartet hatte. SlowAES war nicht so. Die Eigenschaften waren genau dort, wo ich sie erwartet hatte. Es war für mich leicht zu erlernen, da ich mit den Kryptoprogrammiermodellen Java und .NET vertraut war.

Anandams PBKDF2 war nicht ganz auf diesem Niveau. Es wurde nur ein einziger Aufruf der DeriveBytes-Funktion unterstützt. Wenn Sie also sowohl einen Schlüssel als auch eine IV aus einem Kennwort ableiten müssen, funktioniert diese Bibliothek nicht unverändert. Einige geringfügige Änderungen, und es funktioniert gut für diesen Zweck.

BEARBEITEN : Ich habe ein Beispiel für das Packen von SlowAES und einer modifizierten Version von Anandams PBKDF2 in Windows- Skriptkomponenten zusammengestellt . Die Verwendung dieses AES mit einem vom Kennwort abgeleiteten Schlüssel zeigt eine gute Interaktion mit der .NET RijndaelManaged-Klasse.

EDIT2 : Die Demoseite zeigt, wie diese AES-Verschlüsselung von einer Webseite aus verwendet wird. Wenn Sie dieselben Eingaben (iv, Schlüssel, Modus usw.) verwenden, die in .NET unterstützt werden, können Sie gut mit der .NET Rijndael-Klasse zusammenarbeiten. Sie können eine "Ansichtsquelle" erstellen, um das Javascript für diese Seite abzurufen.

EDIT3
eine späte Ergänzung: Javascript Cryptography gilt als schädlich. Die Lektüre wert.

Cheeso
quelle
1
Ich sehe einen gültigen Anwendungsfall - die HTML 5-App, in der alle Dateien lokal gespeichert sind. Wenn lokale Dateien entführt werden können, sind Sie auf jeden Fall zum Scheitern verurteilt ;-).
Nux
8
Über den Link edit3 ist es ein Miststück eines Artikels ... die Hälfte seiner Aussagen ist völlig falsch!
mmm
2
Das Problem mit zufälligen Schlüsseln kann behoben werden, indem der Benutzer die Maus bewegt und Tasten als echten Zufallsgenerator eingibt.
mmm
2
Der Link zur Demonstrationsseite scheint fehlerhaft zu sein.
Sean
26

Bei meiner Suche nach AES-Verschlüsselung habe ich dies von einigen Standford-Studenten gefunden. Behauptet, da draußen am schnellsten zu sein. Unterstützt CCM-, OCB-, GCM- und Blockverschlüsselung. http://crypto.stanford.edu/sjcl/

Danny C.
quelle
das ist es, worüber ich rede!
mmm
5
Die Dokumentation fehlt und ist schwer zu bedienen. Wie ändern Sie die Schlüssellänge? Ich suchte in den Dokumenten herum und konnte es nicht in angemessener Zeit herausfinden. Auch wenn Sie etwas verschlüsseln, wird ein Array von Schlüssel-Wert-Paaren zurückgegeben, aber die Dokumente scheinen diese nicht zu erklären. Am Ende habe ich die bewegliche Typbibliothek verwendet.
CpnCrunch
Und dies ist nicht asynchron. Wenn Sie also eine längere Zeichenfolge zum Beispiel mit AES-CBC verschlüsseln oder entschlüsseln, blockiert es die Benutzeroberfläche
rsz
12

Das Googeln von "JavaScript AES" hat mehrere Beispiele gefunden. Der erste, der auftauchte, soll den Algorithmus erklären und eine Lösung bieten:

Verschiebbare Skripte: AES

Samir Talwar
quelle
1
Ich konnte nicht herausfinden, wie ich die IV in dieser Bibliothek einstellen sollte. Auch ist es nicht sehr OO.
Cheeso
Das Äquivalent der IV im Zählermodus ist die Nonce. Diese Implementierung wurde umformuliert, um mehr OO zu sein. Es enthält nur den CTR-Betriebsmodus (Counter).
ChrisV
Dies funktioniert ziemlich gut, außer dass es keinen EZB-Modus gibt.
CpnCrunch
10

Dieser Beitrag ist jetzt alt, aber die Crypto-Js sind möglicherweise die vollständigste Javascript-Verschlüsselungsbibliothek.

CryptoJS ist eine Sammlung von in JavaScript implementierten kryptografischen Algorithmen. Es enthält die folgenden Chiffren: AES-128, AES-192, AES-256, DES, Triple DES, Kaninchen, RC4, RC4Drop und Hascher: MD5, RIPEMD-160, SHA-1, SHA-256, SHA-512, SHA -3 mit 224, 256, 384 oder 512 Bit.

Sie können auf ihre aussehen wollen Schnellstart - Anleitung , die für die folgenden node.js Port auch die Referenz.

node-cryptojs-aes ist ein node.js-Port von crypto-js

marcz
quelle
1
Leider fehlt die Dokumentation. Es scheint nur eine Kurzanleitung zu geben. Wo ist die vollständige Dokumentation? Es heißt, dass es mehrere Schlüssellängen unterstützt, aber keine Dokumentation dazu.
CpnCrunch
@CpnCrunch: Das vollständige API-Dokument ist nicht online, aber der Code als vollständige Javadoc-API-Kommentare. Und Sie können es generieren. Lesen Sie die Kommentare zu cipher-core.js Quelle, um die Schlüsselgröße der Chiffre und die IV-Größe der Chiffre zu ermitteln.
Marcz
seltsam, wenn ich verschlüssele und wieder entschlüssele, sind die Texte anders
OMGPOP
Es gibt einige Konflikte wegen der Verwendung von openssl
Vlad
9

Vor kurzem musste ich eine Interoperabilität zwischen Javascript und Python durch Verschlüsselung / Entschlüsselung durchführen.

Speziell...

1) Verwenden von AES zum Verschlüsseln in Javascript und Entschlüsseln in Python (Google App Engine) 2) Verwenden von RSA zum Verschlüsseln in Javascript und Entschlüsseln in Python (Google App Engine) 3) Verwenden von Pycrypto

Ich fand viele, viele verschiedene Versionen von RSA und AES im Web und sie waren alle unterschiedlich in ihrem Ansatz, aber ich fand kein gutes Beispiel für die End-to-End-Interoperabilität von Javascript und Python.

Schließlich gelang es mir, nach vielen Versuchen und Irrtümern etwas zusammenzubasteln, das meinen Bedürfnissen entsprach.

Wie auch immer, ich habe ein Beispiel für eine js / webapp gefunden, die mit einem von der Google App Engine gehosteten Python-Server spricht, der AES und RSA-Inhalte mit öffentlichem und privatem Schlüssel verwendet.

Ich denke, ich würde es hier per Link einfügen, falls es für andere von Nutzen sein sollte, die das Gleiche erreichen müssen.

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

und siehe Demo bei rsa-aes-demo DOT appspot DOT com

Bearbeiten: Sehen Sie sich die Ausgabe der Browserkonsole an und zeigen Sie die Quelle an, um einige Hinweise und nützliche Meldungen zu erhalten, was in der Demo vor sich geht

Bearbeiten: Aktualisierter sehr alter und nicht mehr funktionierender Link zur Quelle, auf den jetzt verwiesen wird

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

David Kierans
quelle
1
Vielen Dank dafür! Ich konnte mein Javascript-Aes für mein ganzes Leben nicht dazu bringen, mit meinen Python-Aes zu sprechen.
Spike
1
Ich habe die ganze Nacht versucht (mit Pycrypto und anderen), das zu tun, was mir Ihr Code in 10 Minuten geholfen hat. Ich danke dir sehr!
Remy Vanherweghem
1
Aus irgendeinem Grund habe ich RSA leicht zum Laufen gebracht, aber AES ist ein königlicher Schmerz. Danke dafür!!!
Speedplane
1
Der Link ... wurde nicht gefunden!
Machineaddict
7

Nach meiner eigenen Erfahrung zu urteilen, asmcrypto.js die schnellste AES-Implementierung in JavaScript (insbesondere in Firefox, da es dort asm.js voll ausnutzen kann).

Aus der 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)

Bearbeiten: Die Web Cryptography API ist jetzt in den meisten Browsern implementiert und sollte als primäre Lösung verwendet werden, wenn Sie Wert auf Leistung legen. Beachten Sie, dass IE11 einen früheren Entwurf des Standards implementiert hat, in dem keine Versprechen verwendet wurden.

Einige Beispiele finden Sie hier:

Joel Richard
quelle
Ich bekomme ungefähr 8 MiB / s mit CryptoJS. Ich frage mich, wie das funktionieren würde.
Lodewijk
3

Versuchen Sie es mit asmcrypto.js es mit - es ist sehr schnell.

PS: Ich bin Autor und kann Ihre Fragen gegebenenfalls beantworten. Auch würde ich mich über Feedback freuen :)

vibornoff
quelle
asmcrypto.js ist nett, aber auf IE10 funktioniert es nicht gut. Manchmal bleibt der Browser länger als 1 Minute oder mindestens 45 Sekunden lang hängen. Außerdem habe ich nicht verstanden, warum Sie die globale Mathematikfunktion ersetzen müssen. Es gibt viele Bibliotheken, die diese verwenden.
Decho
2
Könnten Sie kommentieren, wie Sie sicher sind, dass es richtig funktioniert? IOW: Woher wissen Sie, dass Sie AES richtig implementiert haben?
Lodewijk
Die IE10-Leistung ist schlecht, da asm.js überhaupt nicht optimiert wird. Es hat auch ein bisschen andere JIT-Muster. Wenn der Code im IE gut funktioniert, saugt er auch Chrome und FF an. Angenommen, ich hätte die richtige Wahl getroffen. In Bezug auf Math.random gab es eine lange Diskussion . Kurz gesagt, diese Notwendigkeit zur Verhinderung von rohen Math.random- Ausgangslecks (die theoretisch die PRNG-Sicherheit beeinträchtigen können).
Vibornoff
1

Wenn Sie versuchen, Javascript zu verwenden, um die Verwendung von SSL zu vermeiden, denken Sie noch einmal darüber nach. Es gibt viele Maßnahmen auf halbem Weg, aber nur SSL bietet sichere Kommunikation. Javascript-Verschlüsselungsbibliotheken können gegen bestimmte Angriffe helfen, sind jedoch keine echten Man-in-the-Middle-Angriffe.

Wenn Sie nach SSL für die Google App Engine in einer benutzerdefinierten Domain suchen, besuchen Sie wwwizer.com .

Im folgenden Beitrag wird erläutert, wie Sie versuchen, eine sichere Kommunikation mit Javascript herzustellen, und wie Sie Fehler machen: Verwenden Sie das JavaScript-Verschlüsselungsmodul anstelle von SSL / HTTPS

Geschwindigkeitsflugzeug
quelle
1
Ich bin mir nicht sicher, warum dies in Vergessenheit geraten ist, da es ein sehr guter Punkt ist, den jeder, der an die Implementierung einer Javascript-Verschlüsselung denkt, zumindest berücksichtigen muss. Upvoted.
Jules
Die Verwendung von clientseitiger Krypto zur Vermeidung von SSL ist ein alter Punkt, von dem einige Leute sagen, dass sie dagegen spricht: Tatsächlich kann sie HTTPS sicherer machen, passive Angriffe vermeiden oder in heruntergeladenen Anwendungen und Browsererweiterungen verwendet werden. Ich habe nur einmal gesehen, dass es falsch verwendet wurde (mein College, aber sie haben es bereits behoben) und oft richtig verwendet (Cryptocat als Beispiel).
Gustavo Rodrigues