Detalhes do armazenamento em cache de chaves de dados - AWS Encryption SDK

As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.

Detalhes do armazenamento em cache de chaves de dados

A maioria dos aplicativos pode usar a implementação padrão do armazenamento em cache de chave de dados sem escrever código personalizado. Esta seção descreve a implementação padrão e alguns detalhes sobre as opções.

Como o armazenamento em cache de chaves de dados funciona

Quando você usa o armazenamento em cache de chave de dados em uma solicitação para criptografar ou descriptografar dados, o AWS Encryption SDK primeiro pesquisa uma chave de dados no cache que corresponde à solicitação. Se localizar uma correspondência válida, ele usa a chave de dados armazenada em cache para criptografar os dados. Caso contrário, ele gerará uma nova chave de dados, da mesma forma como o faria sem o cache.

O armazenamento em cache da chave de dados não é usado para dados de tamanho desconhecido, como streaming de dados. Isso permite que o CMM de armazenamento em cache imponha o limite máximo de bytes corretamente. Para evitar esse comportamento, adicione o tamanho da mensagem à solicitação de criptografia.

Além de um cache, o armazenamento em cache de chaves de dados usa um gerenciador de armazenamento em cache de materiais criptográficos (CMM de armazenamento em cache). O CMM de armazenamento em cache é um gerenciador de materiais criptográficos (CMM) especializado que interage com um cache e um CMM subjacente. (Quando você especifica um provedor de chaves mestra ou um token de autenticação, o AWS Encryption SDK cria um CMM padrão para você.) O CMM de armazenamento em cache armazena em cache as chaves de dados que seu CMM subjacente retorna. Também impõe limites de segurança de cache definidos por você.

Para evitar que a chave de dados incorreta seja selecionada no cache, todos os CMMs de armazenamento em cache compatíveis exigem que as seguintes propriedades dos materiais criptográficos em cache correspondam à solicitação de material.

nota

O AWS Encryption SDK armazena em cache chaves de dados somente quando o pacote de algoritmos usa uma função de derivação de chaves.

Os seguintes fluxos de trabalho mostram como uma solicitação para criptografar dados é processada com e sem armazenamento em cache da chave de dados. Eles mostram como o armazenamento em cache de componentes que você cria, incluindo o cache e o CMM de armazenamento em cache, são usados no processo.

Criptografar dados sem armazenamento em cache

Para obter materiais de criptografia sem armazenamento em cache:

  1. Um aplicativo solicita que o AWS Encryption SDK criptografe os dados.

    A solicitação especifica um provedor de chaves mestres ou um token de autenticação. O AWS Encryption SDK cria um CMM padrão que interage com a chave mestra ou com o token de autenticação.

  2. O AWS Encryption SDK solicitará ao CMM materiais de criptografia (obter materiais criptográficos).

  3. O CMM solicita seu token de autenticação (C e JavaScript) ou o provedor de chaves mestras (Java e Python) para materiais criptográficos. Isso pode envolver uma chamada a um serviço criptográfico, como o AWS Key Management Service (AWS KMS). O CMM retorna os materiais de criptografia para o AWS Encryption SDK.

  4. O AWS Encryption SDK usa a chave de dados em texto simples para criptografar os dados. Ele armazena os dados criptografados e as chaves de dados criptografadas em uma mensagem criptografada, que ele retorna ao usuário.

Criptografar dados sem armazenamento em cache

Criptografar dados com armazenamento em cache

Para obter materiais de criptografia com armazenamento de chaves de dados em cache:

  1. Um aplicativo solicita que o AWS Encryption SDK criptografe os dados.

    A solicitação especifica um gerenciador de armazenamento em cache materiais criptográficos (CMM de armazenamento em cache) associado a um gerenciador de materiais criptográficos (CMM) subjacente. Quando você especifica um provedor de chaves mestras ou um token de autenticação, o AWS Encryption SDK cria um CMM padrão para você.

  2. O SDK solicita ao CMM de armazenamento em cache especificado materiais de criptografia.

  3. O CMM de armazenamento em cache solicita materiais de criptografia do cache.

    1. Se encontrar uma correspondência, o cache atualizará a idade e usará os valores da entrada do cache correspondente, retornando os materiais de criptografia armazenados em cache ao CMM de armazenamento em cache.

      Se a entrada do cache estiver em conformidade com os limites de segurança, o CMM de armazenamento em cache a retorna ao SDK. Caso contrário, ele instruirá o cache a remover a entrada e prosseguir como se não houvesse correspondência.

    2. Se o cache não puder encontrar uma correspondência válida, o CMM de armazenamento em cache solicitará que CMM subjacente gere uma nova chave de dados.

      O CMM subjacente obtém os materiais criptográficos de seu token de autenticação (C e JavaScript) ou do provedor de chaves mestras (Java e Python). Isso pode envolver uma chamada a um serviço criptográfico, como o AWS Key Management Service. O CMM subjacente retorna o texto simples e cópias criptografadas da chave de dados ao CMM de armazenamento em cache.

      O CMM de armazenamento em cache salva os novos materiais de criptografia no cache.

  4. O CMM de armazenamento em cache retorna os materiais de criptografia para o AWS Encryption SDK.

  5. O AWS Encryption SDK usa a chave de dados em texto simples para criptografar os dados. Ele armazena os dados criptografados e as chaves de dados criptografadas em uma mensagem criptografada, que ele retorna ao usuário.

Criptografar dados com a chave de dados armazenada em cache

Criar um cache de material de criptografia

O AWS Encryption SDK define os requisitos para um cache de material de criptografia usado no armazenamento em cache de chaves de dados. Também fornece um cache local, que é um cache least recently used (LRU - menos usado recentemente) configurável e na memória. Para criar uma instância do cache local use o construtor do LocalCryptoMaterialsCache em Java e Python, a função getLocalCryptographicMaterialsCache em JavaScript ou o construtor aws_cryptosdk_materials_cache_local_new em C.

O cache local contém lógica para gerenciamento básico do cache, incluindo adição, remoção e correspondência de entradas armazenadas em cache e manutenção do cache. Você não precisa escrever nenhuma lógica de gerenciamento de cache personalizado. O cache local pode ser usado como está, ser personalizado ou substituído por cache compatível.

Quando cria um cache local, você define sua capacidade, isto é, o número máximo de entradas que o cache pode conter. Essa configuração ajuda a criar um cache eficiente com reutilização limitada de chaves de dados.

O AWS Encryption SDK for Java e o AWS Encryption SDK for Python também fornecem um cache de materiais criptográficos nulo (NullCryptoMaterialsCache). O NullCryptoMaterialsCache retorna um erro para todas as operações GET e não responde a operações PUT. Você pode usar o NullCryptoMaterialsCache em testes ou desabilitar temporariamente o armazenamento em cache em uma aplicação que inclui código de armazenamento em cache.

No AWS Encryption SDK, cada cache de materiais criptográficos é associado a um gerenciador armazenamento em cache de materiais criptográficos (CMM de armazenamento em cache). O CMM de armazenamento em cache obtém chaves de dados do cache, coloca chaves de dados no cache e impõe os limites de segurança que você define. Ao criar umCMM de armazenamento em cache, você especifica o cache que ele usa e o CMM subjacente ou o provedor de chaves mestras que gera as chaves de dados que ele armazena em cache.

Criar um gerenciador de material de criptografia de armazenamento em cache

Para habilitar o armazenamento em cache da chave de dados, você cria um cache e um gerenciador de armazenamento em cache (CMM de armazenamento em cache). Em seguida, em suas solicitações para criptografar ou descriptografar dados, você especifica um CMM de armazenamento em cache em vez de um gerenciador de materiais criptográficos (CMM) pardão, um provedor de chaves mestras ou um token de autenticação.

Há dois tipos de CMMs. Os dois obtêm chaves de dados (e o material criptográfico relacionado), mas de diferentes maneiras, da seguinte forma:

  • Um CMM é associado a um token de autenticação (C ou JavaScript) ou a um provedor de chaves mestras (Java e Python). Quando o SDK solicita ao CMM materiais de criptografia ou descriptografia, o CMM obtém os materiais de seu token de autenticação ou do provedor de chaves mestras. Em Java e Python, o CMM usa as chaves mestras para gerar, criptografar ou descriptografar as chaves de dados. Em C e em JavaScript, o token de autenticação gera, criptografa e retorna os materiais criptográficos.

  • Um CMM de armazenamento em cache está associado a um cache, como um cache local e a um CMM subjacente. Quando o SDK solicita materiais criptográficos ao CMM de armazenamento em cache, o CMM de armazenamento em cache tenta obtê-los do cache. Se não conseguir encontrar uma correspondência, o CMM de armazenamento em cache solicitará os materiais ao seu CMM subjacente. Depois, ele armazenará os novos materiais criptográficos antes de retorná-los ao chamador.

O CMM de armazenamento em cache também impõe limites de segurança que você define para cada entrada do cache. Como os limites de segurança são definidos e impostos pelo CMM de armazenamento em cache, você pode usar qualquer cache compatível, mesmo que o cache não esteja projetado para material confidencial.

O que é uma entrada de chave de dados em cache?

O cache de chaves de dados armazena chaves de dados e o material criptográfico relacionado em um cache. Cada entrada inclui os elementos listados a seguir. Você pode considerar essas informações úteis ao decidir se deseja usar o atributo de armazenamento em cache de chave de dados e ao configurar os limites de segurança em um gerenciador de armazenamento em cache de materiais criptográficos (CMM de armazenamento em cache).

Entradas armazenadas em cache para solicitações de criptografia

As entradas adicionadas a um cache de chave de dados como resultado de uma operação de criptografia incluem os seguintes elementos:

  • Chave de dados de texto não criptografado

  • Chaves de dados criptografadas (uma ou mais)

  • Contexto de criptografia

  • Chave de assinatura de mensagem (se uma for usada)

  • Pacote de algoritmos

  • Metadados, incluindo contadores de uso para impor limites de segurança

Entradas armazenadas em cache para solicitações de descriptografia

As entradas adicionadas a um cache de chave de dados como resultado de uma operação de descriptografia incluem os seguintes elementos:

  • Chave de dados de texto não criptografado

  • Chave de verificação de assinatura (se uma for usada)

  • Metadados, incluindo contadores de uso para impor limites de segurança

Contexto de criptografia: como selecionar entradas do cache

Você pode especificar um contexto de criptografia em qualquer solicitação para criptografar dados. No entanto, o contexto de criptografia desempenha uma função especial no armazenamento em cache de chaves de dados. Ele permite criar subgrupos de chaves de dados em seu cache, mesmo quando as chaves de dados forem originárias do mesmo CMM de armazenamento em cache.

Um contexto de criptografia é um conjunto de pares de chave-valor que contêm dados arbitrários não secretos. Durante a criptografia, o contexto de criptografia é associado de maneira criptográfica aos dados criptografados de forma que o mesmo contexto de criptografia é necessário para descriptografar os dados. No AWS Encryption SDK, o contexto de criptografia é armazenado na mensagem criptografada com os dados criptografados e as chaves de dados.

Ao usar um cache de chave de dados, você também pode usar o contexto de criptografia para selecionar chaves de dados armazenadas em cache específicas para suas operações de criptografia. O contexto de criptografia é salvo na entrada do cache com a chave de dados (ele faz parte do ID de entrada do cache). As chaves de dados armazenadas em cache só são reutilizadas quando os contextos de criptografia correspondem. Se desejar reutilizar determinadas chaves de dados para uma solicitação de criptografia, especifique o mesmo contexto de criptografia. Para evitar essas chaves de dados, especifique outro contexto de criptografia.

O contexto de criptografia é sempre opcional, mas é recomendado. Se você não especificar um contexto de criptografia na solicitação, um contexto de criptografia vazio será incluído no identificador de entrada do cache e correspondido a cada solicitação.

Meu aplicativo está usando chaves de dados armazenadas em cache?

O armazenamento em cache de chaves de dados é uma estratégia de otimização muito eficaz para determinados aplicativos e cargas de trabalho. No entanto, como isso implica algum risco, é importante determinar o quão eficaz é provável que seja para a sua situação e decidir se os benefícios superam os riscos.

Como o armazenamento em cache de chaves de dados reutiliza chaves de dados, o efeito mais óbvio é a redução do número de chamadas para gerar novas chaves de dados. Quando o armazenamento em cache da chave de dados é implementado, o AWS Encryption SDK chama a operação GenerateDataKey do AWS KMS apenas para criar a chave de dados inicial e quando o cache falha. Mas, o armazenamento em cache melhora o desempenho de forma perceptível somente em aplicativos que geram várias chaves de dados com as mesmas características, incluindo o mesmo contexto de criptografia e pacote de algoritmos.

Para determinar se a implementação do AWS Encryption SDK está realmente usando chaves de dados do cache, tente as seguintes técnicas.

  • Nos logs da infraestrutura de sua chave mestra, verifique a frequência de chamadas para criar novas chaves de dados. Quando o armazenamento em cache de chaves de dados está efetivo, o número de chamadas para criar novas chaves deve cair de forma perceptível. Por exemplo, se você estiver usando um provedor de chaves mestras do AWS KMS ou um token de autenticação, pesquise chamadas GenerateDataKey nos logs do CloudTrail.

  • Compare as mensagens criptografadas que o AWS Encryption SDK retorna em resposta a diferentes solicitações de criptografia. Por exemplo, se você estiver usando o AWS Encryption SDK for Java, compare o objeto ParsedCiphertext de diferentes chamadas de criptografia. No AWS Encryption SDK para JavaScript, compare o conteúdo da propriedade encryptedDataKeys do MessageHeader. Quando as chaves de dados são reutilizadas, as chaves de dados criptografadas na mensagem criptografada são idênticas.