As respostas existentes que utilizam SJCL, CryptoJS e / ou WebCrypto não estão necessariamente erradas, mas não são tão seguras quanto você pode suspeitar inicialmente. Geralmente você deseja usar libsodium . Primeiro vou explicar o porquê, depois como.
Por que não SJCL, CryptoJS, WebCrypto, etc.?
Resposta curta: para que sua criptografia seja realmente segura, essas bibliotecas esperam que você faça muitas escolhas, por exemplo, o modo de cifra em bloco (CBC, CTR, GCM; se você não souber qual dos três que acabei de listar é seguro) uso e sob quais restrições, você não deve ser sobrecarregada com esse tipo de escolha em tudo ).
A menos que o seu cargo seja engenheiro de criptografia , as probabilidades estão contra a sua implementação segura.
Por que evitar o CryptoJS?
O CryptoJS oferece vários blocos de construção e espera que você saiba como usá-los com segurança. O padrão é o modo CBC ( arquivado ).
Por que o modo CBC é ruim?
Leia este artigo sobre as vulnerabilidades do AES-CBC .
Por que evitar o WebCrypto?
O WebCrypto é um padrão potluck, projetado pelo comitê, para propósitos ortogonais à engenharia de criptografia. Especificamente, o WebCrypto foi criado para substituir o Flash, não para fornecer segurança .
Por que evitar o SJCL?
A API pública e a documentação da SJCL pedem que os usuários criptografem dados com uma senha lembrada por humanos. Isso raramente é o que você deseja fazer no mundo real.
Além disso: sua contagem padrão de rodadas PBKDF2 é aproximadamente 86 vezes menor que você deseja . AES-128-CCM provavelmente está bem.
Das três opções acima, o SJCL é o menos provável de terminar em lágrimas. Mas existem melhores opções disponíveis.
Por que Libsodium é melhor?
Você não precisa escolher entre um menu de modos de cifra, funções de hash e outras opções desnecessárias. Você nunca arriscará estragar seus parâmetros e remover toda a segurança do seu protocolo .
Em vez disso, libsodium oferece apenas opções simples ajustadas para segurança máxima e APIs minimalistas.
crypto_box()
/ crypto_box_open()
ofereço criptografia de chave pública autenticada.
- O algoritmo em questão combina o X25519 (ECDH sobre o Curve25519) e o XSalsa20-Poly1305, mas você não precisa saber (nem se importar) sobre isso para usá-lo com segurança
crypto_secretbox()
/ crypto_secretbox_open()
ofereça criptografia autenticada por chave compartilhada.
- O algoritmo em questão é XSalsa20-Poly1305, mas você não precisa saber / cuidar
Além disso, o libsodium possui ligações em dezenas de linguagens de programação populares , portanto, é muito provável que o libsodium funcione apenas ao tentar interoperar com outra pilha de programação. Além disso, o libsodium tende a ser muito rápido sem sacrificar a segurança.
Como usar Libsodium em JavaScript?
Primeiro, você precisa decidir uma coisa:
- Deseja apenas criptografar / descriptografar dados (e talvez ainda usar de alguma forma o texto sem formatação nas consultas do banco de dados com segurança) e não se preocupar com os detalhes? Ou...
- Você precisa implementar um protocolo específico?
Se você selecionou a primeira opção , obtenha o CipherSweet.js .
A documentação está disponível online . EncryptedField
é suficiente para a maioria dos casos de uso, mas as APIs EncryptedRow
e EncryptedMultiRows
podem ser mais fáceis se você tiver muitos campos distintos que deseja criptografar.
Com o CipherSweet, você nem precisa saber o que é um nonce / IV para usá-lo com segurança.
Além disso, este alças int
/ float
criptografia sem vazamento fatos sobre o conteúdo através de tamanho texto cifrado.
Caso contrário, você desejará o sódio plus , que é uma interface amigável para vários invólucros libsodium. O Sodium-Plus permite que você escreva código de plataforma cruzada, assíncrono e de alto desempenho, fácil de auditar e de raciocinar.
Para instalar o sódio-plus, basta executar ...
npm install sodium-plus
Atualmente, não há CDN pública para suporte ao navegador. Isso mudará em breve. No entanto, você pode pegar sodium-plus.min.js
a partir da versão mais recente Github se você precisar dele.
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());
})();
A documentação para o sódio-plus está disponível no Github.
Se você deseja um tutorial passo a passo, este artigo do dev.to tem o que você está procurando.