Ich bin daran interessiert, eine kleine App für den persönlichen Gebrauch zu erstellen, die Informationen auf der Clientseite mit JavaScript verschlüsselt und entschlüsselt. Die verschlüsselten Informationen werden in einer Datenbank auf einem Server gespeichert, jedoch niemals in der entschlüsselten Version.
Es muss nicht super duper sicher sein, aber ich möchte einen derzeit ungebrochenen Algorithmus verwenden.
Im Idealfall könnte ich so etwas tun
var gibberish = encrypt(string, salt, key);
um die codierte Zeichenfolge zu generieren, und so ähnlich
var sensical = decrypt(gibberish, key);
um es später zu entschlüsseln.
Bisher habe ich Folgendes gesehen: http://bitwiseshiftleft.github.io/sjcl/
Gibt es noch andere Bibliotheken, die ich mir ansehen sollte?
encryption
javascript
Jeremiahs
quelle
quelle
Antworten:
quelle
Wie wäre es mit CryptoJS ?
Es ist eine solide Kryptobibliothek mit vielen Funktionen. Es implementiert Hashers, HMAC, PBKDF2 und Chiffren. In diesem Fall benötigen Sie Chiffren. Schauen Sie sich das Schnellstart-Quide auf der Homepage des Projekts an.
Sie könnten so etwas wie mit dem AES machen:
Aus Sicherheitsgründen wird der AES-Algorithmus zum Zeitpunkt meines Schreibens als ungebrochen angesehen
Bearbeiten:
Die Online-URL scheint nicht verfügbar zu sein. Sie können die heruntergeladenen Dateien zur Verschlüsselung über den unten angegebenen Link verwenden und die entsprechenden Dateien in Ihrem Stammordner der Anwendung ablegen.
https://code.google.com/archive/p/crypto-js/downloads
oder ein anderes CDN wie https://cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.2/components/aes-min.js verwendet
quelle
Ich habe eine unsichere, aber einfache Textverschlüsselung / -entschlüsselung erstellt. Keine Abhängigkeiten mit einer externen Bibliothek.
Dies sind die Funktionen
Und Sie können sie wie folgt verwenden:
quelle
let
. 😒︎Die vorhandenen Antworten, die SJCL, CryptoJS und / oder WebCrypto nutzen, sind nicht unbedingt falsch, aber nicht so sicher, wie Sie zunächst vermuten. Im Allgemeinen möchten Sie libsodium verwenden . Zuerst erkläre ich warum, dann wie.
Warum nicht SJCL, CryptoJS, WebCrypto usw.?
Kurze Antwort: Damit Ihre Verschlüsselung tatsächlich sicher ist, erwarten diese Bibliotheken, dass Sie zu viele Entscheidungen treffen, z. B. den Blockverschlüsselungsmodus (CBC, CTR, GCM; wenn Sie nicht sagen können, für welche der drei oben aufgeführten Verschlüsselungen sicher ist verwenden und unter welchen Einschränkungen sollten Sie mit dieser Art von Auswahl überhaupt nicht belastet werden ).
Sofern Ihre Berufsbezeichnung nicht Kryptografietechniker ist , stehen die Chancen gut, dass Sie sie sicher implementieren.
Warum CryptoJS vermeiden?
CryptoJS bietet eine Handvoll Bausteine und erwartet, dass Sie wissen, wie Sie diese sicher verwenden können. Standardmäßig wird sogar der CBC-Modus verwendet ( archiviert ).
Warum ist der CBC-Modus schlecht?
Lesen Sie diesen Artikel über AES-CBC-Schwachstellen .
Warum sollte man WebCrypto vermeiden?
WebCrypto ist ein Potluck-Standard, der vom Komitee für Zwecke entwickelt wurde, die orthogonal zur Kryptografietechnik sind. Insbesondere sollte WebCrypto Flash ersetzen und keine Sicherheit bieten .
Warum SJCL vermeiden?
Die öffentliche API und Dokumentation von SJCL fordert Benutzer auf, Daten mit einem vom Menschen gespeicherten Passwort zu verschlüsseln. Dies ist selten, wenn überhaupt, das, was Sie in der realen Welt tun möchten.
Zusätzlich: Die Standardanzahl der PBKDF2-Runden ist ungefähr 86-mal so klein, wie Sie es möchten . AES-128-CCM ist wahrscheinlich in Ordnung.
Von den drei oben genannten Optionen endet SJCL am seltensten in Tränen. Es gibt jedoch bessere Optionen.
Warum ist Libsodium besser?
Sie müssen nicht zwischen einem Menü mit Verschlüsselungsmodi, Hash-Funktionen und anderen unnötigen Optionen wählen. Sie werden niemals riskieren, Ihre Parameter zu vermasseln und die gesamte Sicherheit aus Ihrem Protokoll zu entfernen .
Stattdessen bietet libsodium nur einfache Optionen, die auf maximale Sicherheit und minimalistische APIs abgestimmt sind.
crypto_box()
Ichcrypto_box_open()
biete eine authentifizierte Verschlüsselung mit öffentlichem Schlüssel an.crypto_secretbox()
Ichcrypto_secretbox_open()
biete eine authentifizierte Verschlüsselung mit gemeinsamem Schlüssel an.Darüber hinaus verfügt libsodium über Bindungen in Dutzenden gängiger Programmiersprachen. Daher ist es sehr wahrscheinlich, dass libsodium nur funktioniert, wenn versucht wird, mit einem anderen Programmierstapel zusammenzuarbeiten. Außerdem ist libsodium in der Regel sehr schnell, ohne die Sicherheit zu beeinträchtigen.
Wie verwende ich Libsodium in JavaScript?
Zunächst müssen Sie eines entscheiden:
Wenn Sie die erste Option ausgewählt haben , rufen Sie CipherSweet.js ab .
Die Dokumentation ist online verfügbar .
EncryptedField
ist für die meisten Anwendungsfälle ausreichend, aber die APIsEncryptedRow
undEncryptedMultiRows
können einfacher sein, wenn Sie viele unterschiedliche Felder haben, die Sie verschlüsseln möchten.Mit CipherSweet müssen Sie nicht einmal wissen, was ein Nonce / IV ist , um es sicher zu verwenden.
Darüber hinaus ist diese Griffe
int
/float
Verschlüsselung ohne Fakten über den Inhalt durch verschlüsselte Text Größe undicht.Andernfalls benötigen Sie Natrium-Plus , ein benutzerfreundliches Frontend für verschiedene Libsodium-Wrapper. Mit Sodium-Plus können Sie performanten, asynchronen, plattformübergreifenden Code schreiben, der einfach zu prüfen und zu begründen ist.
Um Natrium-Plus zu installieren, führen Sie einfach ...
Derzeit gibt es kein öffentliches CDN für die Browserunterstützung. Dies wird sich bald ändern. Sie können jedoch bei Bedarf
sodium-plus.min.js
aus der neuesten Github-Version greifen .Die Dokumentation zu Natrium-Plus ist auf Github verfügbar.
Wenn Sie eine Schritt-für-Schritt-Anleitung wünschen , finden Sie in diesem dev.to-Artikel genau das, wonach Sie suchen.
quelle
Moderne Browser unterstützen jetzt die
crypto.subtle
API, die native Verschlüsselungs- und Entschlüsselungsfunktionen (nicht weniger asynchron!) Mit einer der folgenden Methoden bietet: AES-CBC, AES-CTR, AES-GCM oder RSA-OAEP.https://www.w3.org/TR/WebCryptoAPI/#dfn-Crypto
quelle
Bevor Sie dies implementieren, lesen Sie bitte die Antwort von Scott Arciszewski .
Ich möchte, dass Sie sehr vorsichtig mit dem sind, was ich mitteilen möchte, da ich wenig bis gar keine Sicherheitskenntnisse habe (es besteht eine hohe Wahrscheinlichkeit, dass ich die unten stehende API missbrauche). Daher würde ich diese Antwort gerne aktualisieren mit Hilfe der Gemeinschaft .
Wie @richardtallent in seiner Antwort erwähnt hat , wird die Web Crypto API unterstützt, daher verwendet dieses Beispiel den Standard. Zum jetzigen Zeitpunkt gibt es 95,88% der weltweiten Browserunterstützung .
Ich werde ein Beispiel mit der Web Crypto API teilen
Bevor wir fortfahren, beachten Sie bitte ( Zitat aus MDN ):
Ich respektiere die Sicherheit sehr und habe sogar zusätzliche Teile von MDN hervorgehoben ... Sie wurden gewarnt.
Nun zum eigentlichen Beispiel ...
JSFiddle:
Hier zu finden: https://jsfiddle.net/superjose/rm4e0gqa/5/
Hinweis:
Beachten Sie die Verwendung von
await
Schlüsselwörtern. Verwenden Sie es innerhalb einerasync
Funktion oder verwenden Sie.then()
und.catch()
.Generieren Sie den Schlüssel:
Verschlüsseln:
Entschlüsseln
Konvertieren von ArrayBuffer von String hin und her (Fertig in TypeScript):
Weitere Beispiele finden Sie hier (ich bin nicht der Eigentümer): // https://github.com/diafygi/webcrypto-examples
quelle
CryptoJS wird nicht mehr unterstützt. Wenn Sie es weiterhin verwenden möchten, können Sie zu dieser URL wechseln:
<script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.2/rollups/aes.js"></script>
quelle
Verwenden Sie SimpleCrypto
Verwenden von encrypt () und decrypt ()
quelle
Einfache Funktionen,
quelle