Checksum Database
Banco de dados de checksums do Go (sum.golang.org) que garante autenticidade e integridade de módulos
O que é o Checksum Database?
O Checksum Database (Banco de Dados de Checksums) é um serviço global mantido pelo time do Go e acessível em sum.golang.org. Ele fornece uma fonte de verdade globalmente consistente para os hashes criptográficos de todos os módulos públicos do Go.
Por que ele existe?
Embora o arquivo go.sum contenha hashes SHA-256 das dependências baixadas, ele opera com base no princípio de "confiança no primeiro uso" (trust on first use). Isso significa que:
O primeiro desenvolvedor a baixar um módulo define o hash
Não há garantia de que diferentes desenvolvedores recebam o mesmo código
Um servidor malicioso poderia entregar código diferente para diferentes pessoas
O Checksum Database resolve este problema garantindo que todos os desenvolvedores no mundo recebam exatamente o mesmo código para uma mesma versão de módulo.
Como funciona?
Arquitetura: Transparent Log
O Checksum Database utiliza uma estrutura de Merkle tree (árvore de Merkle) baseada no sistema Trillian do Google. Esta arquitetura é conhecida como "Transparent Log" (Log Transparente) e possui propriedades que tornam impossível alterar dados sem ser detectado.
Verificação criptográfica
O comando go utiliza duas formas de verificação:
Inclusion Proofs (Provas de Inclusão): Confirmam que um registro específico existe no log
Consistency Proofs (Provas de Consistência): Verificam que a árvore não foi comprometida ou alterada
Endpoints da API
O Checksum Database oferece dois endpoints principais:
/lookup: Retorna um "signed tree head" (STH) e as linhasgo.sumsolicitadas/tile: Fornece pedaços da árvore chamados "tiles" que o comandogousa para gerar provas criptográficas
Fluxo de trabalho
Quando você executa comandos como go get ou go mod download:
O comando
gobaixa o código-fonte do móduloCalcula o hash SHA-256 do código
Consulta o sum.golang.org para obter o hash esperado
Compara os dois hashes:
✅ Se coincidirem: adiciona ao
go.sume continua❌ Se divergirem: reporta o erro e interrompe a execução
Benefícios de segurança
1. Proteção contra ataques direcionados
Mesmo que um atacante comprometa um servidor proxy ou origin, ele não pode distribuir código malicioso para desenvolvedores específicos sem ser detectado. O Checksum Database detectaria a inconsistência.
2. Imutabilidade de versões
Nem mesmo os autores dos módulos podem alterar o código de uma versão já publicada sem que o Checksum Database detecte a mudança. Isso garante que v1.2.3 sempre será exatamente o mesmo código, para sempre.
3. Verificação global
Todos os desenvolvedores verificam contra a mesma fonte de verdade, criando uma rede global de verificação.
Configuração e variáveis de ambiente
GOSUMDB
A variável de ambiente GOSUMDB controla qual checksum database usar:
⚠️ Atenção: Desabilitar o GOSUMDB reduz significativamente a segurança do seu projeto.
GONOSUMDB
Define padrões de módulos que não devem ser verificados no checksum database (útil para módulos privados):
GOPRIVATE
Define módulos privados (implica em GONOSUMDB e GONOPROXY):
Quando o Checksum Database é consultado?
O checksum database é consultado quando:
✅ O módulo é público
✅ O módulo não está em
go.sum✅ O módulo não corresponde aos padrões em
GONOSUMDB/GOPRIVATE✅
GOSUMDBnão está definido comooff
O checksum database NÃO é consultado quando:
❌ O módulo já está em
go.sum❌ O módulo está em
GOPRIVATE❌ O módulo corresponde a
GONOSUMDB❌
GOSUMDB=off
Verificação manual
Você pode verificar manualmente um módulo usando:
Histórico
Go 1.13
Agosto 2019
Lançamento oficial do sum.golang.org como produção
Go 1.12
Fevereiro 2019
Suporte experimental via GOSUMDB
Comparação: go.sum vs Checksum Database
Escopo
Local do projeto
Global (todos os desenvolvedores)
Verificação
Primeira vez: nenhuma
Sempre contra fonte de verdade
Segurança
Confiança no primeiro uso
Verificação criptográfica
Detecta
Mudanças locais
Mudanças globais + ataques direcionados
Estrutura
Arquivo texto simples
Merkle tree (Transparent Log)
Recursos adicionais
Perguntas frequentes
Meus módulos privados são enviados para sum.golang.org?
Não. Módulos que correspondem a GOPRIVATE ou GONOSUMDB nunca são consultados no checksum database. O servidor nunca vê seus módulos privados.
O que acontece se sum.golang.org estiver fora do ar?
O comando go tentará usar checksums já presentes em go.sum. Para novos módulos, a operação falhará até que o serviço volte. Você pode configurar um mirror ou, em último caso, usar GOSUMDB=off temporariamente.
Posso hospedar meu próprio checksum database?
Sim! Você pode configurar sua própria instância usando ferramentas como Athens ou implementar um servidor compatível com o protocolo do sumdb.
O checksum database conhece todo o código do meu projeto?
Não. O database apenas armazena hashes criptográficos. Ele não tem acesso ao código-fonte, apenas aos checksums e metadados de módulos públicos.
Last updated