KeyLab

[ KL / GUIA / PIX-CRYPTO ]

Criptografia no PIX e no SPB

Como o Sistema de Pagamentos Instantâneos do BACEN protege cada mensagem com JWS, ES256 e XMLDSig — e o que você precisa saber para integrar como PSP.

O Stack Criptográfico do PIX

O PIX é um sistema de liquidação bruta em tempo real (LBTR) operado pelo Banco Central do Brasil desde novembro de 2020. Embora a experiência do usuário final seja simples — escaneie um QR Code, transfira em segundos — por trás de cada transação existe uma sequência rígida de operações criptográficas exigidas pelo manual técnico do BACEN.

O sistema é dividido em três módulos principais, cada um com seu próprio modelo de assinatura: o SPI (Sistema de Pagamentos Instantâneos) carrega as mensagens de transferência em si e usa JWS com ES256 ou RS256; o DICT (Diretório de Identificadores de Contas Transacionais) gere o cadastro de chaves PIX e usa XMLDSig RSA-SHA256; e o STR (Sistema de Transferência de Reservas) — o sistema legado de liquidação interbancária — também usa XMLDSig. Todas as assinaturas devem usar certificados ICP-Brasil A1 ou A3 emitidos por Autoridades Certificadoras credenciadas.

JWS no SPI

Cada mensagem SPI é um objeto JSON serializado de forma canônica, hasheado com SHA-256 e assinado com a chave privada da instituição. O envelope JWS resultante segue o RFC 7515 com header JOSE indicando o algoritmo ("alg": "ES256" ou "alg": "RS256") e referenciando o certificado X.509 da instituição via x5c (cadeia completa em Base64) ou x5t (thumbprint SHA-1).

O BACEN fortemente recomenda ES256 (ECDSA P-256) desde 2022. As assinaturas ECDSA têm ~64 bytes contra ~256 bytes do RSA 2048, o que importa em um sistema processando bilhões de mensagens por dia. A verificação também é mais rápida, e a curva P-256 (também conhecida como secp256r1 ou prime256v1) é o padrão NIST mais amplamente implementado em libs de qualquer linguagem.

Cuidados práticos: serialização JSON canônica (RFC 8785 JCS) é obrigatória para que o hash bata entre quem assina e quem verifica. Qualquer reordenação de chaves, espaço em branco extra ou variação de escape em strings produz um digest diferente e a assinatura falha. Use uma lib que implemente JCS corretamente — não tente fazer manualmente.

XMLDSig no DICT e no STR

XMLDSig (XML Digital Signature, recomendação W3C) é o padrão para assinatura de mensagens XML usado no DICT (operações sobre chaves PIX) e no STR (liquidação interbancária legada). A assinatura é embutida na mensagem XML como elemento <Signature> dentro do envelope.

O processo: cada elemento referenciado é canonicalizado (Canonical XML 1.0 ou Exclusive C14N), hasheado com SHA-256, e o DigestValue resultante é colocado no bloco <SignedInfo>. O bloco SignedInfo inteiro é então canonicalizado e assinado com RSA-SHA256 (algoritmo identificado por http://www.w3.org/2001/04/xmldsig-more#rsa-sha256). O certificado X.509 do assinante vai no <KeyInfo>.

A canonicalização XML é a parte mais traiçoeira. Diferenças sutis (ordem de atributos, namespaces declarados vs herdados, espaços em branco entre tags) podem produzir DigestValues diferentes para XMLs visualmente idênticos. Use bibliotecas maduras (xmldsigjs no Node, xmlsec1 em C, signxml em Python, Apache Santuario em Java) e nunca tente implementar C14N manualmente.

Certificados ICP-Brasil — A1 vs A3

Toda assinatura SPI/DICT/STR deve usar um certificado emitido por uma Autoridade Certificadora credenciada pela ICP-Brasil. Há dois tipos relevantes para PSPs:

A1 é um certificado em arquivo PKCS#12 (.pfx) com chave privada exportável, validade de 1 ano, instalável em qualquer servidor. É o padrão para integrações server-to-server de alto volume — a chave privada fica em um HSM ou em disco protegido por chave de criptografia separada.

A3 é um certificado em hardware (token USB, smart card, ou HSM FIPS 140-2 nível 3+) com chave privada não-exportável e validade de até 5 anos. Operações criptográficas acontecem dentro do dispositivo. É exigido para operações de alto valor por algumas instituições e oferece proteção forte contra exfiltração da chave.

Para PIX em produção, a maioria dos PSPs usa A1 em HSMs Thales payShield, Atos Atalla ou Futurex Excrypt, com a chave gerada e mantida dentro do HSM. A ICP-Brasil credencia o HSM como dispositivo equivalente a token A3 nesse cenário.

Ambientes de Homologação e Produção

O BACEN expõe dois ambientes distintos. Homologação (também chamado de sandbox) aceita certificados ICP-Brasil válidos OU, em alguns casos, certificados auto-assinados explicitamente registrados via portal de homologação. Use este ambiente para todo desenvolvimento e testes — ele tem o mesmo contrato técnico que produção mas opera sobre dados sintéticos.

Produção exige certificado ICP-Brasil válido registrado no DIRETORIO do BACEN no momento da habilitação da instituição como PSP. A rotação de certificados (anual para A1) requer atualização do DIRETORIO com pelo menos 30 dias de antecedência. Falhar nessa rotação derruba a integração inteira — todos os pagamentos pendentes a partir do instante da expiração são rejeitados.

Perguntas Frequentes

O que é JWS no contexto do PIX?
JWS (JSON Web Signature) é o formato padronizado pelo RFC 7515 que o BACEN escolheu para assinar mensagens SPI no PIX. Cada mensagem JSON é serializada de forma canônica, hasheada com SHA-256 e assinada com a chave privada da instituição via ECDSA P-256 (algoritmo ES256) ou RSA 2048+ (algoritmo RS256). O cabeçalho JOSE indica o algoritmo usado e referencia o certificado X.509 da instituição via x5c ou x5t.
Qual a diferença entre SPI, STR e DICT?
Os três são módulos do SPB do BACEN. SPI (Sistema de Pagamentos Instantâneos) é o backbone do PIX para liquidação em tempo real entre instituições — mensagens JSON assinadas com JWS. STR (Sistema de Transferência de Reservas) é o sistema legado de transferências interbancárias com mensagens XML assinadas com XMLDSig RSA-SHA256. DICT (Diretório de Identificadores de Contas Transacionais) é o serviço de chaves PIX (CPF, telefone, e-mail, EVP) que vincula uma chave a uma conta — também usa XMLDSig.
Por que o PIX usa ES256 ao invés de RS256?
ES256 (ECDSA com curva P-256) produz assinaturas muito menores (~64 bytes) que RS256 (~256 bytes para chaves RSA 2048), o que reduz drasticamente o overhead em um sistema com bilhões de mensagens por dia. A computação também é mais rápida tanto para assinar quanto para verificar. O BACEN aceita ambos, mas ES256 é fortemente recomendado para novas integrações desde 2022.
O que é XMLDSig e como ele difere de JWS?
XMLDSig (XML Digital Signature, W3C Rec) é o padrão de assinatura para mensagens XML usado no STR e no DICT do BACEN. Envolve canonicalização XML (C14N), cálculo de DigestValue por elemento, e uma SignatureValue final assinando o SignedInfo serializado. É consideravelmente mais verboso que JWS — uma única assinatura XMLDSig tem várias centenas de bytes de boilerplate XML antes mesmo dos dados criptográficos.
Como obter um certificado ICP-Brasil para PIX em sandbox?
Para o ambiente de homologação SPI/PIX, o BACEN aceita certificados ICP-Brasil A1 ou A3 de qualquer Autoridade Certificadora credenciada (Certisign, Serasa, AC SOLUTI, AC SAFEWEB, etc.). Em sandbox, alguns PSPs também aceitam certificados auto-assinados configurados manualmente no portal de homologação. Para produção, o certificado precisa ser ICP-Brasil válido, registrado no BACEN via DIRETORIO no momento da habilitação da instituição como PSP.
O que é uma chave PIX EVP?
EVP (Endereço Virtual de Pagamento) é uma chave PIX em formato UUID v4 que não revela nenhuma informação pessoal do titular (diferente de CPF, telefone ou e-mail). Cada conta pode ter até 5 chaves PIX para pessoa física ou 20 para pessoa jurídica, e o EVP é tipicamente usado quando o titular quer receber pagamentos sem expor outros identificadores. A chave é validada criptograficamente via DICT com assinatura XMLDSig do PSP detentor.

Ferramentas KeyLab para PIX

KeyLab inclui ferramentas dedicadas ao SPB brasileiro na categoria SPB do Calculator:

  • SPB — STR (TED): assinatura e verificação de mensagens RSFN STR com XMLDSig RSA-SHA256.
  • SPB — SPI (PIX): assinatura e verificação JWS com ES256 (ECDSA) ou RS256 (RSA) para PIX.
  • SPB — DICT: operações sobre o diretório de chaves PIX com XMLDSig RSA-SHA256.

Acesse em /calculator e navegue até a categoria SPB.