Criptografando dados com JavaScript: Algoritmo AES
Você precisa de um algoritmo de criptografia que funcione no navegador e com ótima performance? Recomendo o algoritmo AES.
Requisito Importante: Dados Criptografados
Recentemente surgiu uma oportunidade para desenvolver um software relativamente simples. Ao todo seriam aproximadamente 10 telas e 8 tabelas no banco de dados, baixa complexidade.
Porém durante a análise percebi que algumas informações seriam sigilosas, inclusive para mim (programador). Seriam dados que somente o proprietário do sistema teria permissão para editar e visualizar.
Neste caso: Qual é a melhor arquitetura? Qual é o melhor algoritmo de criptografia? Como fica a performance do programa?
Arquitetura Planejada
Decidi criar um software com Ruby on Rails no back-end (REST API) e Vue.js no front-end (Vuetify para UI Components).
Em relação a criptografia, pensei na seguinte estrutura:
- Existirá uma senha específica para criptografia que ficará armazenada somente no lado do cliente, ou seja, esta senha não trafegará pela rede para não ter riscos de interceptação.
- Somente o proprietário do software terá ciência desta senha.
- Os dados sempre estarão criptografados no servidor.
- Somente no lado do cliente é que os dados serão descriptografados.
Para esta situação foi a alternativa mais segura e sem comprometer a performance do software.
Escolhendo o Algoritmo de Criptografia
Neste caso o algoritmo a ser escolhido precisa utilizar uma chave simétrica, ou seja, a senha que criptografa os dados é a mesma senha que descriptografa-os.
Existem vários algoritmos de chave simétrica, mas o mais popular e com ótimo nível de segurança é o AES (Advanced Encryption Standard).
O AES é utilizado desde 2001 pelo governo dos Estados Unidos da América e foi escolhido em um concurso que avaliou algoritmos do mundo inteiro. Este algoritmo também é conhecido como Rijndael, que é o seu nome original e somente depois do concurso que passou a ser chamado de AES.
Além do ótimo nível de segurança, o AES requer pouco processamento e funciona bem em equipamentos com processamento limitado. Ponto positivo para o cenário em questão.
Escolhendo a Biblioteca de Criptografia
Existem várias bibliotecas para JavaScript com suporte ao algoritmo AES, mas a biblioteca que eu escolhi foi a AES-JS. Os fatores que me levaram a escolhe-la são:
- Não possui dependências.
- O algoritmo é implementado em menos de 800 linhas de código (contando as linhas de espaçamento).
- Você facilmente consegue entender a estrutura e pode até depurar.
- É super leve (aproximadamente 44kb).
- A documentação é pequena, mas tem o necessário.
- No momento que escrevo este artigo são 800 Stars no GitHub e 120.000 downloads semanais no NPM.
Uma coisa que é importante deixar claro é que existem "variações" do AES, que são chamados de "Modes Operations". Na página do AES-JS no GitHub há mais detalhes sobre qual variação se adapta melhor ao seu cenário.
Um ponto negativo que eu percebi é que todas as bibliotecas que eu testei (inclusive bibliotecas implementadas em outras linguagens) geraram resultados diferentes para as mesmas entradas de dados.
Por exemplo, no algoritmo MD5 você terá o mesmo resultado (hash) independente da linguagem ou biblioteca que você está utilizando. No AES isso não aconteceu, cada biblioteca tem algumas variações: Diferença no cálculo dos Arrays de inicialização, conversão do texto para binário ou hexadecimal, etc...
Vale ressaltar que isso não foi um problema. Talvez seja bom do ponto de vista de segurança.
Este sistema está em produção a algumas semanas e até então não há problemas. Se você procura um bom algoritmo de criptografia para JavaScript, recomendo AES.
Dúvidas ou sugestões é só entrar em contato. Abraço.