Le risposte esistenti che sfruttano SJCL, CryptoJS e / o WebCrypto non sono necessariamente errate ma non sono sicure come si potrebbe inizialmente sospettare. Generalmente si desidera utilizzare libsodium . Prima spiegherò perché, poi come.
Perché non SJCL, CryptoJS, WebCrypto, ecc.?
Risposta breve: Affinché la tua crittografia sia effettivamente sicura, queste librerie si aspettano che tu faccia troppe scelte, ad esempio la modalità di cifratura a blocchi (CBC, CTR, GCM; se non riesci a capire quale delle tre che ho appena elencato è sicura per uso e in quali limiti, non si dovrebbe essere gravati da questo tipo di scelta a tutti ).
A meno che il tuo incarico non sia ingegnere crittografico , le probabilità sono impilate contro di te per implementarlo in modo sicuro.
Perché evitare CryptoJS?
CryptoJS offre una manciata di blocchi predefiniti e si aspetta che tu sappia come usarli in modo sicuro. L'impostazione predefinita è anche in modalità CBC ( archiviata ).
Perché la modalità CBC è difettosa?
Leggi questo articolo sulle vulnerabilità di AES-CBC .
Perché evitare WebCrypto?
WebCrypto è uno standard avanzato, progettato dal comitato, per scopi che sono ortogonali all'ingegneria della crittografia. Nello specifico, WebCrypto doveva sostituire Flash, non fornire sicurezza .
Perché evitare SJCL?
L'API pubblica e la documentazione di SJCL invitano gli utenti a crittografare i dati con una password ricordata dall'uomo. Questo è raramente, se mai, quello che vuoi fare nel mondo reale.
Inoltre: il conteggio dei round PBKDF2 predefinito è circa 86 volte più piccolo di quanto si desideri . AES-128-CCM probabilmente sta bene.
Delle tre opzioni sopra, SJCL è la meno probabile che finisca in lacrime. Ma ci sono opzioni migliori disponibili.
Perché è meglio Libsodium?
Non è necessario scegliere tra un menu di modalità di cifratura, funzioni di hash e altre opzioni inutili. Non rischierai mai di rovinare i tuoi parametri e rimuovere tutta la sicurezza dal tuo protocollo .
Al contrario, libsodium offre solo semplici opzioni ottimizzate per la massima sicurezza e API minimaliste.
crypto_box()
/ crypto_box_open()
offre la crittografia autenticata della chiave pubblica.
- L'algoritmo in questione combina X25519 (ECDH su Curve25519) e XSalsa20-Poly1305, ma non è necessario sapere (o preoccuparsene) per usarlo in modo sicuro
crypto_secretbox()
/ crypto_secretbox_open()
offrire crittografia autenticata con chiave condivisa.
- L'algoritmo in questione è XSalsa20-Poly1305, ma non è necessario conoscere / preoccuparsi
Inoltre, libsodium ha legami in dozzine di linguaggi di programmazione popolari , quindi è molto probabile che libsodium funzioni solo quando si cerca di interagire con un altro stack di programmazione. Inoltre, libsodium tende ad essere molto veloce senza sacrificare la sicurezza.
Come usare Libsodium in JavaScript?
Innanzitutto, devi decidere una cosa:
- Vuoi solo crittografare / decrittografare i dati (e forse in qualche modo usare ancora in modo sicuro il testo normale nelle query del database) e non preoccuparti dei dettagli? O...
- Devi implementare un protocollo specifico?
Se hai selezionato la prima opzione , ottieni CipherSweet.js .
La documentazione è disponibile online . EncryptedField
è sufficiente per la maggior parte dei casi d'uso, ma le API EncryptedRow
e EncryptedMultiRows
potrebbero essere più facili se si hanno molti campi distinti che si desidera crittografare.
Con CipherSweet, non è nemmeno necessario sapere cosa sia un nonce / IV per utilizzarlo in modo sicuro.
Inoltre, questo gestisce int
/ float
crittografia senza perdere fatti sui contenuti attraverso la dimensione del testo cifrato.
Altrimenti, vorrai sodio-plus , che è un frontend intuitivo per vari wrapper libsodium. Sodium-Plus ti consente di scrivere codice multipiattaforma performante, asincrono, facile da controllare e ragionare.
Per installare sodium-plus, esegui semplicemente ...
npm install sodium-plus
Al momento non esiste un CDN pubblico per il supporto del browser. Questo cambierà presto. Tuttavia, si può afferrare sodium-plus.min.js
da l'ultima release Github se ne avete bisogno.
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());
})();
La documentazione per sodium-plus è disponibile su Github.
Se desideri un tutorial passo-passo, questo articolo dev.to ha quello che stai cercando.