Estou interessado em criar um pequeno aplicativo para uso pessoal que criptografará e descriptografará informações no lado do cliente usando JavaScript. As informações criptografadas serão armazenadas em um banco de dados em um servidor, mas nunca a versão descriptografada.
Ele não precisa ser super seguro, mas eu gostaria de usar um algoritmo ininterrupto no momento.
Idealmente, eu seria capaz de fazer algo como
var gibberish = encrypt(string, salt, key);
para gerar a string codificada e algo como
var sensical = decrypt(gibberish, key);
decodificá-lo mais tarde.
Até agora eu já vi isso: http://bitwiseshiftleft.github.io/sjcl/
Alguma outra biblioteca que eu deveria procurar?
encryption
javascript
jeremiahs
fonte
fonte
Respostas:
fonte
E o CryptoJS ?
É uma biblioteca de criptografia sólida, com muitas funcionalidades. Ele implementa hashers, HMAC, PBKDF2 e cifras. Nesse caso, as cifras são o que você precisa. Confira o guia de início rápido na página inicial do projeto.
Você poderia fazer algo parecido com o AES:
Quanto à segurança, no momento em que escrevo, o algoritmo AES é considerado ininterrupto
Editar:
Parece que o URL on-line está inoperante e você pode usar os arquivos baixados para criptografia a partir do link fornecido abaixo e colocar os respectivos arquivos na pasta raiz do aplicativo.
https://code.google.com/archive/p/crypto-js/downloads
ou usou outro CDN como https://cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.2/components/aes-min.js
fonte
Eu criei um utilitário de codificação / decifração de texto inseguro, mas simples. Não há dependências com nenhuma biblioteca externa.
Estas são as funções
E você pode usá-los da seguinte maneira:
fonte
let
.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.crypto_secretbox()
/crypto_secretbox_open()
ofereça criptografia autenticada por chave compartilhada.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:
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 APIsEncryptedRow
eEncryptedMultiRows
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 ...
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.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.
fonte
Os navegadores modernos agora oferecem suporte à
crypto.subtle
API, que fornece funções nativas de criptografia e descriptografia (assíncronas!) Usando um destes métodos: AES-CBC, AES-CTR, AES-GCM ou RSA-OAEP.https://www.w3.org/TR/WebCryptoAPI/#dfn-Crypto
fonte
Antes de implementar isso, consulte a resposta de Scott Arciszewski .
Quero que você tenha muito cuidado com o que estou prestes a compartilhar, pois tenho pouco ou nenhum conhecimento de segurança (há uma grande chance de estar usando mal a API abaixo), por isso seria mais que bem-vindo para atualizar esta resposta com a ajuda da comunidade .
Como @richardtallent mencionado em sua resposta , há suporte para a API Web Crypto, portanto, este exemplo usa o padrão. Até o momento da redação deste artigo, 95,88% do suporte global a navegadores .
Vou compartilhar um exemplo usando a API Web Crypto
Antes de prosseguir, observe ( citando na MDN ):
Eu respeito muito a segurança e até atrevi partes adicionais da MDN ... Você foi avisado
agora, para o exemplo real ...
JSFiddle:
Encontrado aqui: https://jsfiddle.net/superjose/rm4e0gqa/5/
Nota:
Observe o uso de
await
palavras-chave. Use-o dentro de umaasync
função ou use.then()
e.catch()
.Gere a chave:
Criptografar:
Descriptografar
Convertendo ArrayBuffer para frente e para trás a partir de String (concluído em TypeScript):
Você pode encontrar mais exemplos aqui (eu não sou o proprietário): // https://github.com/diafygi/webcrypto-examples
fonte
O CryptoJS não é mais suportado. Se você quiser continuar usando, você pode mudar para este URL:
<script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.2/rollups/aes.js"></script>
fonte
Use SimpleCrypto
Usando encrypt () e decrypt ()
fonte
Funções simples,
fonte