Proteção de Dados: criptografia com NodeJS — Parte 1
Uma das tarefas mais importantes de um desenvolvedor é manipular os dados da sua aplicação de maneira correta. E se tratando de dados sensíveis como número do cartão de crédito, cpf, data de nascimento e etc a responsabilidade redobra. Na verdade, com a aplicação da lei federal de proteção de dados isso passou a ser uma obrigação.
Sendo assim, nesse pequeno artigo vamos tratar de como podemos assumir essa responsabilidade utilizando NodeJS e JavaScript. Lembrando que cada um conhece o seu contexto e os níveis de segurança que a sua aplicação necessita, logo a ideia desse artigo é fornecer um norte para encontrar a melhor solução.
Proteção de dados sensíveis com criptografia
Nessa primeira parte vamos entender um pouco de como funciona a criptografia para depois irmos para a prática.
O que é hashing?
Hashing é o processo de converter qualquer valor de entrada de qualquer tamanho ou tipo, para um valor de tamanho fixo contendo letras e números. Por exemplo, seria como se você pudesse converter uma página inteira de um livro para uma única sentença e ainda assim poder utilizar essa única sentença para descobrir o conteúdo inteiro da página do livro. É exatamente o que o processo de hashing faz! E ele realiza isso utilizando o que chamando de hash functions.
O que são hash functions?
Podemos dizer que elas são propriamente o algoritmo que realiza o cálculo matemático responsável por transformar qualquer informação recebida em um bloco fixo de letras e números (hashing) como demonstra a figura abaixo.


Cada saída gerada pela hash function é única, ou seja, para cada palavra ou frase haverá apenas um único hash no final. Por exemplo, se passamos a entrada “nodejs” a saída será “c81e2d0e1bfbb8e44090c4fd8f8cc7c4“. Porém se utilizarmos “Nodejs”, iniciando com letra maiúscula o resultado é completamente diferente: “d9d970a1252831d8db36a3d3319a1c99”. Uma pequena mudança na entrada muda drasticamente a saída. Então cada entrada tem sua respectiva saída!
E para realizar este cálculo podemos encontrar vários tipos de algoritmos a nossa disposição como: SHA-256, MD5, BLACK3 e etc. (com certeza você já deve ter ouvido falar de alguns deles) A escolha do algoritmo é um fator muito importante pois só assim poderemos garantir a segurança e integridade dos nossos dados. Caso queira consultar a aplicabilidade de cada algoritmo, pode fazê-lo nesse link: https://en.wikipedia.org/wiki/Secure_Hash_Algorithms
Garantindo integridade dos dados no processo de hashing
Apesar de tudo o que acabamos de considerar, o processo de hashing em si não garante a integridade dos dados que criptografamos.
Veja o exemplo abaixo:


Como a figura acima demonstrou, em um ambiente não seguro é muito fácil acontecer de um código malicioso ser adicionado em uma mensagem criptografada. Assim, quando a saída chegar ao seu destino, não será mais a mensagem original e sim um código alterado que poderá afetar todo o ambiente no qual houver tentativas de descriptografa-lo e/ou manipula-lo.
Ai então entra em ação nossas as Keyed-Hash Message Authentication Code (HMAC) ou em uma tradução livre: Código de autenticação de mensagem hash com chave.
Em termos simples o HMAC é nada mais que uma chave em formato hash anexada ao hash original. Quando o hash original chegar ao seu destino, para tentar manipula-lo será necessário uma chave idêntica. Assim ele saberá que tal hash original não foi manipulado. O HMAC não criptografa a mensagem. Em vez disso, a mensagem deve ser enviada juntamente com o hash HMAC. Os participantes com a chave secreta irão fazer o hash da mensagem novamente e, se for autêntico, os hashes serão correspondentes.


Bom até aqui aprendemos como funciona o processo de hashing e como garantir a integridade do hash criado utilizando HMACs. Poderíamos nos aprofundar muito mais.
Entretanto, essa base será suficiente para podermos ir para o código na parte 2, onde vamos ver como utilizando a classe Crypto do node podemos aplicar todos esses conceitos.
Enquanto isso, aproveite para ler um pouco mais sobre segurança em APIs Restuful.