Objetivo:
Dar uma visão geral sobre os principais aspectos de criptografia que nos interessam para o estudo do serviço AWS KMS.
Navegação
I) Fundamentos
Vamos utilizar um exemplo simples para explicar o princípio da criptografia.
Suponha que você tenha um cofre na sua casa que requer um código numérico de 5 dígitos como senha. Esta senha poderia ser 12345. Mas com medo de esquecer a senha você precisa anotá-la em algum lugar como em um post-it. O problema é que qualquer um que leia o post-it terá acesso ao conteúdo do cofre. Como medida de segurança, você poderia criar um mecanismo simples que adiciona um número entre 0 e 9 a todos os dígitos da senha, assim, se o número escolhido for 3, a senha original 12345 depois de modificada pelo mecanismo ficaria 45678. Este novo valor poderia ser escrito no Post-it ao invés da senha original e qualquer um que leia o Posti-it não terá a senha do cofre. O número 45678 criado durante a aplicação do mecanismo é conhecido como Ciphertext, o mecanismo que adiciona um número a senha original é o algoritmo de criptografia e o número 3 é a Key.

Se ao invés de escolher o número 3 como Key, você escolher o número 4, então, o Ciphertext gerado pelo algoritmo de criptografia será 56789.

Com este exemplo simples podemos dizer que a função do algoritmo de criptografia é “embaralhar” a senha original usando uma Key que só é conhecida por você.
Você pode “desembaralhar” o Ciphertext usando o algoritmo e como resultado ter a senha original.

Pressupondo que o algoritmo de criptografia é de conhecimento público, então, a Key é o que realmente mantém a senha criptografada segura, pois somente com a Key seria possível obter a senha original.
Para proteger a Key (valor 3) e evitar que outros possam descriptografar o Ciphertext, você pode aplicar o mecanismo de criptografia na própria Key, usando uma segunda Key chamada Key2 e com o valor de 5, assim a Key (valor 3) original criptografada seria 3 + 5 = 8. Entretanto, você pode querer proteger a Key2, pois alguém que tenha acesso a ela poderá usá-la para descriptografar o Ciphertext e ter acesso à Key e depois usar o algoritmo para descriptografar novamente e ter acesso a senha do cofre, desta forma, seria preciso criptografar a Key2 usando uma Key3. O problema aqui é que sempre haverá uma última Key que deve ser criptografada para que ninguém tenha acesso aos dados originais, e isto tornaria o processo de criptografar Keys interminável. Neste ponto é que o KMS pode ajudar. Ele protege a Key utilizada para criptografar sua senha original e faz com que somente você possa utilizar a Key para descriptografar e ter acesso a senha do cofre. O KMS utiliza as permissões do IAM para controlar quem pode ou não ter acesso aos dados criptografados.
Então, na prática, para utilizar o KMS para proteger a senha do seu cofre você faz uma solicitação ao serviço KMS pedindo para que ele criptografe a senha do cofre e quando precisar recuperá-la é só fazer uma nova solicitação para KMS solicitando o dado original, no caso, a senha do cofre.
O KMS utiliza um algoritmo de criptografia reconhecidamente seguro e que usa uma chave de 256 bits. Este algoritmo é o Advanced Encryption Standard (AES-256). Este algoritmo obviamente é muito mais complexo e eficiente do que o utilizado neste exemplo.
A seguir está ilustrado como seria utilizar o KMS para gerenciar a senha do cofre.
II) Chaves simétricas e assimétricas
Até o momento foi usada uma única chave (Key) para criptografar e descriptografar os dados, isto é, utilizamos uma chave simétrica. Entretanto, em alguns casos, podemos querer utilizar uma chave para criptografar os dados e outra chave para descriptografar. Este tipo de chave é conhecida como chave assimétrica. Na verdade, as chaves assimétricas trabalham em pares, sendo a chave utilizada para criptografar conhecida como Public Key e a chave usada para descriptografar chamada Private Key.


Não há problema de a Public Key ser conhecida por todos, já que ela é utilizada somente para criptografar os dados e não pode ser usada para descriptografar. Outro ponto é que as chaves pública e privada estão ligadas matematicamente e somente a chave privada pode descriptografar os dados criptografados pela chave pública que está associada a ela.
Imagine que você é o responsável por concentrar dados confidenciais de várias pessoas, por exemplo, os dados de contas bancárias ou cartões de crédito. As pessoas desejam enviar os dados se forma segura, isto é, criptografados. Se fosse usada uma única chave simétrica os dados seriam criptografados e descriptografados usando a mesma chave. Assim, os usuários utilizariam a chave para criptografar os dados antes de enviar. Depois de receber o Ciphertext você utilizaria a mesma chave para descriptografar e obter os dados de conta bancária. O problema aqui é que usando uma única chave para todos uma pessoa poderia pegar os dados criptografados de outra pessoa e obter os dados da conta bancária usando a chave que ele também, já que todos os usuário tem a mesma chave de criptografia. Para contornar este problema você poderia utilizar chaves diferentes, uma para cada pessoa. O problema desta solução é que você teria que administrar diversas chaves simétricas. Para resolver de forma mais eficiente poderia ser utilizada uma chame assimétrica, desta forma, todos os usuários teriam uma única chave pública e com ela faria a criptografia dos dados bancários antes do envio. Quando você receber os dados criptografados, poderia usar a chave privada (que só você tem) para descriptografar o Ciphertext e obter os dados das contas bancárias. As pessoas também não poderiam descriptografar os dados umas das outras pois as públicas somente podem ser usadas para criptografar os dados e mesmo que uma delas consiga o Ciphertext de uma outra não conseguiria descriptografar utilizando a chave pública.

III) Tipos de encriptação – Encryption in flight (SSL)
É utilizada quando se quer enviar dados sensíveis criptografados, pois caso estes dados sejam interceptados no meio do caminho, o interceptador não terá acesso aos dados originais.
Por exemplo, durante uma compra online você deseja que o número do seu cartão de crédito esteja protegido do momento que sai do seu dispositivo até chegar no servidor no site de e-commerce. Para isto, o seu número de cartão de crédito deve ser encriptado antes de ser enviado e o servidor irá descriptografar depois de recebê-lo. Em geral, os certificados SSL e o protocolo HTTPS garantem os dados criptografados in flight.
Apesar da complexidade envolvida no processo, as linguagens de programação trabalham bem com este tipo de criptografia, assim não é uma questão que precisamos nos preocupar diretamente.
IV) Tipos de encriptação – Encryption at rest
Depois que o servidor recebe os dados e executa o processo de desencriptação ele precisa encriptar os dados novamente para poder armazená-los, pois em caso de comprometimento dos dados armazenados em um ataque hacker, os dados estariam protegidos.
Os dados podem ser encriptados at rest graças a uma chave conhecida como Data Key. Estas chaves de encriptação precisam ser gerenciadas em algum lugar e o servidor precisam ter acesso a elas quando necessário. O KMS é o responsável pelo gerenciamento das chaves usadas pelo servidor para encriptar os dados at rest.
Exemplo, desejamos enviar dados que serão armazenados em um volume EBS. O dado é trafegado pelo protocolo HTTPS e recebido pelo EBS, em seguida o EBS solicita a Data Key ao KMS e criptografa os dados que são armazenados em disco. Em uma eventual solicitação dos dados, o EBS recupera a Data Key do KMS, descriptografa os dados armazenados e envia ao solicitante.
V) Tipos de encriptação – Client side encryption
Neste tipo de encriptação o cliente é o responsável pela criptografia dos dados que podem ser armazenados em um servidor, entretanto, o servidor não executa o processo de desencriptação dos dados em nenhum momento. Em uma eventual recuperação dos dados, eles serão enviados criptografados para o cliente que ficará responsável pela desencriptação, recuperando a Data Key de algum gerenciador de chaves e obtendo os dados originais. Este processo é conhecido por Envelope Encryption.
It’s done!