Criptografia da camada de aplicativos

As APIs Push Provisioning do lado do cliente são compatíveis com PGP ou JWE para criptografia da camada de aplicativos.

Criptografia PGP

O PGP é um conjunto padrão de algoritmos de criptografia, descriptografia e assinatura que oferecem privacidade e autenticação criptográfica.

Ao usar o PGP para criptografar payloads, os parceiros precisam oferecer compatibilidade com:

  • a criptografia e descriptografia de payloads com várias chaves PGP;
  • a assinatura de payloads com várias chaves PGP;
  • a verificação de um payload com várias assinaturas, sendo que qualquer uma delas pode ser a assinatura com a chave fornecida pelo Google;
  • a descriptografia de payloads codificados em base64 seguros para a Web.

As chaves públicas PGP fornecidas ao Google precisam ter uma subchave usada para criptografia. Ela permite a rotação independente da chave mestra. A chave mestra é usada para a verificação da identidade. Chaves privadas precisam ser RSA de 2048 bits ou mais e expirar em um ano, com duração máxima de dois anos.

Para começar o desenvolvimento, é necessário trocar chaves PGP com o Google. Nesta etapa, é preciso gerar um par de chaves públicas/privadas PGP, fornecer uma chave pública ao Google e receber uma chave pública do Google. Durante o desenvolvimento, será necessário trocar as chaves do sandbox usadas no desenvolvimento e teste fora da produção. Para fazer o teste de produção e o lançamento, será preciso executar outra troca de chaves de produção.

Como gerar uma nova chave PGP

Supondo que você tenha um binário GPG no caminho do sistema, use o seguinte comando POSIX para criar um novo par de chaves.

$ gpg --full-generate-key

Quando solicitado, selecione uma chave RSA com pelo menos 2048 bits de entropia e expiração de 1-2 anos. Esse comando criará uma chave mestra (rotulada como SC de "S"igning and "C"ertificate, ou geração de assinatura e certificado) e uma subchave (rotulada como "E" de "E"ncryption, ou criptografia).

Configuração da biblioteca PGP

Enviar payloads

  1. Ao assinar, você precisa usar SHA384 como o algoritmo de resumo. Não use SHA1ou MD5
  2. Ao criptografar, use AES256 como o algoritmo de criptografia simétrica. não use CAST5 ou IDEA
  3. Ao criptografar ou assinar mensagens, selecione a subchave com a finalidade correspondente. Use a chave CAN_SIGN para assinar e a chave ENCRYPT_COMMS/ENCRYPT_STORAGE para criptografar

Receber payloads

  1. Ao verificar um payload, certifique-se de que a biblioteca seja compatível com algoritmos de hash modernos, como SHA384. O Google vai começar a usar esses algoritmos em todas as novas chaves a partir de 14 de maio de 2023.
  2. Ao descriptografar um payload, verifique se a biblioteca é compatível com algoritmos modernos de criptografia simétrica, como AES256. O Google vai começar a usar esses algoritmos em todas as novas chaves a partir de 14 de maio de 2023.

Exemplo de criptografia de payload do GPG

O comando abaixo é um exemplo de como selecionar opções seguras ao usar o GPG. Espera-se que essa operação seja realizada em um ambiente confiável em que as pessoas não tenham acesso às chaves privadas ou aos arquivos de entrada sensíveis.

gpg --output signed-and-encrypted.pgp \
  --sign --digest-algo SHA384 \
  --encrypt --cipher-algo AES256 \
  --armor \
  --recipient {key_id} \
  input.txt

O GPG vai selecionar automaticamente a chave certa do pacote para cada operação solicitada.

Criptografia JWE

O JSON Web Encryption (JWE) é um padrão definido por rfc7516 (em inglês) para criptografar conteúdo no nível do aplicativo.

Ao usar o JWE para criptografar payloads, os parceiros precisam oferecer compatibilidade com as seguintes opções:

  • Descriptografia de payloads de uma de várias chaves JWE.
  • Serialização compacta.
  • Compressão JWE (ou seja, zip="DEF").
  • Os algoritmos RSA-OAEP/RSA-OAEP-256 ou ECDH-ES para gerenciamento de chaves.
    • O RSAES-PKCS1-V1_5 não é recomendado, mas é aceito.
  • O algoritmo A256GCM serve para criptografia de conteúdo.

Chaves privadas precisam ser RSA/ECDH-ES que expiram em um ano, com um ciclo de vida máximo de dois anos. Todas as identidades de chave privada precisam sempre permanecer no servidor do parceiro e, portanto, todos os valores de assinatura precisam ser calculados no servidor do parceiro.

O cliente e o servidor irão criptografar o corpo JSON de acordo com a especificação do JSON Web Encryption (JWE). Todo o corpo do POST ou da resposta será um token JWE, usando a opção "Serialização compacta" do JWE.

Para começar o desenvolvimento, é necessário trocar chaves JWE com o Google. Nesta etapa, é preciso gerar um par de chaves públicas/privadas, fornecer uma chave pública ao Google e receber uma chave pública do Google. Durante o desenvolvimento, será necessário trocar as chaves do sandbox usadas no desenvolvimento e teste fora da produção. Para fazer o teste de produção e o lançamento, será preciso executar outra troca de chaves de produção.

Os parceiros precisam oferecer a compatibilidade de envio e recebimento de mensagens usando a compactação do JWE (ou seja, zip="DEF"). Solicitações e respostas serão criptografadas pela criptografia assimétrica (chave pública) usando chaves JWE trocadas entre si. Além disso, a verificação de assinatura do JWS pode ser usada com o JWE, em que o conteúdo é assinado antes da criptografia e verificado após a descriptografia. O JWS também usa chaves assimétricas, chave privada para assinatura e chave pública para verificação.