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 primária. A chave primária é usada para a confirmação de identidade. As chaves privadas precisam ser RSA de 2.048 bits (ou mais) que expiram em um ano , com vida útil 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. Antes do teste em produção e lançamento, faça 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, você pode usar 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 primária (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
- Ao assinar, use
SHA384como o algoritmo de resumo. Não useSHA1ouMD5 - Ao criptografar, use
AES256como o algoritmo de criptografia simétrica. não useCAST5ouIDEA - Ao criptografar ou assinar mensagens, selecione a subchave com a finalidade correspondente. Use a chave
CAN_SIGNpara assinar e a chaveENCRYPT_COMMS/ENCRYPT_STORAGEpara criptografar
Receber payloads
- 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. - 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 a seguir é 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 seleciona de modo automático a chave adequada do pacote para cada operação solicitada.
Criptografia JWE com assinatura JWS
O JSON Web Encryption (JWE) é um padrão definido por rfc7516 (em inglês) para criptografar conteúdo no nível do aplicativo. JSON Web Signature (JWS) é um padrão definido por rfc7515 (em inglês) para assinar conteúdo no nível do aplicativo.
As solicitações e respostas são tokens JWE criptografados de forma assimétrica (chave pública) com a opção de serialização compacta. O token JWE contém o payload assinado como um token JWS. O JWS também usa chaves assimétricas: chave privada para assinatura e chave pública para verificação.
Ao enviar um payload, assine primeiro e depois criptografe esse payload. Ao receber um payload, primeiro descriptografe e depois verifique a assinatura.
Para usar JWE, os parceiros precisam oferecer suporte às seguintes opções:
- Serialização compacta.
- Descriptografia de payloads usando uma de várias chaves JWE.
- Gerenciamento de chaves usando o algoritmo RSA-OAEP, RSA-OAEP-256 ou ECDH-ES.
- Cabeçalho
algpreenchido (RFC 7518, seção 4.1).
- Cabeçalho
- Criptografia de conteúdo usando o algoritmo A256GCM,
A128GCM,
A128CBC-HS256 ou
A256CBC-HS512.
- Cabeçalho
encpreenchido.
- Cabeçalho
- Cabeçalho
kidpara identificar a chave de criptografia pública. - Os payloads de mensagens que usam criptografia JWE precisam utilizar o tipo de conteúdo application/jose; charset=utf-8.
Para usar JWS, os parceiros precisam oferecer suporte às seguintes opções:
- Serialização compacta.
- Verificação de payloads de uma das várias chaves JWS
- Criação de assinatura usando o algoritmo HS256, HS384, HS512, RS256, RS384, RS512, ES256, PS256, PS384 ou PS512.
- Cabeçalho
algpreenchido (RFC 7518, seção 3.1).
- Cabeçalho
- Cabeçalho
kidpara identificar a chave de assinatura privada.
As strings JWE/JWS serão codificadas como UTF-8 e os payloads delas podem ser bytes arbitrários.
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 nesse mesmo lugar.
Antes de iniciar o desenvolvimento, você precisa trocar as chaves JWE e JWS com o Google. É necessário trocar as chaves no formato JWK, conforme definido em rfc7517. Nessa etapa, você precisa gerar um par de chaves pública/privada, fornecer a chave pública ao Google e receber uma outra em troca. Durante o desenvolvimento, será necessário trocar as chaves do sandbox usadas no desenvolvimento e teste fora da produção. Antes do teste em produção e lançamento, faça outra troca de chaves de produção.