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()
Ich crypto_box_open()
biete eine authentifizierte Verschlüsselung mit öffentlichem Schlüssel an.
- Der fragliche Algorithmus kombiniert X25519 (ECDH über Curve25519) und XSalsa20-Poly1305, aber Sie müssen dies nicht wissen (oder sich auch nur darum kümmern), um es sicher zu verwenden
crypto_secretbox()
Ich crypto_secretbox_open()
biete eine authentifizierte Verschlüsselung mit gemeinsamem Schlüssel an.
- Der fragliche Algorithmus ist XSalsa20-Poly1305, aber Sie müssen es nicht wissen / pflegen
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:
- Möchten Sie nur Daten verschlüsseln / entschlüsseln (und vielleicht trotzdem den Klartext in Datenbankabfragen sicher verwenden) und sich nicht um die Details kümmern? Oder...
- Müssen Sie ein bestimmtes Protokoll implementieren?
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 APIs EncryptedRow
und EncryptedMultiRows
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 ...
npm install sodium-plus
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 .
const { SodiumPlus } = require('sodium-plus');
let sodium;
(async function () {
if (!sodium) sodium = await SodiumPlus.auto();
let plaintext = 'Your message goes here';
let key = await sodium.crypto_secretbox_keygen();
let nonce = await sodium.randombytes_buf(24);
let ciphertext = await sodium.crypto_secretbox(
plaintext,
nonce,
key
);
console.log(ciphertext.toString('hex'));
let decrypted = await sodium.crypto_secretbox_open(
ciphertext,
nonce,
key
);
console.log(decrypted.toString());
})();
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.