Keyhound
Detector de credenciais expostas em código, com cobertura para serviços
brasileiros que ferramentas como gitleaks e trufflehog não reconhecem:
Mercado Pago, Asaas, Pagar.me, Cielo, PagSeguro, chave Pix, certificado
digital A1 e a chave service_role do Supabase.
Por que existe
Durante o desenvolvimento é comum colar a chave direto no arquivo para testar — e esquecer. O código vai para o repositório e a chave vai junto. Há robôs varrendo o GitHub atrás exatamente disso: o intervalo entre publicar e a chave ser usada por terceiros costuma ser de minutos.
Remover a chave do arquivo não resolve: ela continua no histórico do Git, recuperável por qualquer pessoa com acesso ao repositório.
Instalação
pip install keyhound
Requer Python 3.11 ou superior.
Uso
keyhound scan . # varre o diretório atual
keyhound scan ./src -m high # só severidade alta ou acima
keyhound scan . -f json # saída para pipeline
keyhound scan . --fail-on critical # sai com código 1 se achar crítico
keyhound history . # varre todo o histórico do git
keyhound history . -n 100 # só os 100 commits mais recentes
keyhound history . -f json
O valor do segredo é sempre mascarado na saída — na tela, no JSON e em qualquer log.
Na integração contínua
keyhound scan . --fail-on critical
Código de saída 1 quando encontra algo no nível informado, 0 quando
está limpo.
O que detecta
Globais — AWS, GitHub, Slack, chave privada PEM, JWT, string de conexão de banco, Google API, Stripe, senha e token em atribuição literal.
Brasileiros — Mercado Pago, Asaas, Pagar.me/Stone, MerchantKey da
Cielo, token do PagSeguro/PagBank, service_role e chave secreta do
Supabase, chave Pix aleatória (EVP) e senha de certificado A1.
A regra do service_role merece destaque: essa chave ignora todas as
políticas de Row Level Security do Supabase. Vazada no frontend, expõe o
banco inteiro. É visualmente idêntica à chave anon, que é pública e
inofensiva — o Keyhound distingue as duas.
Reduzindo ruído
Ferramenta que grita demais é desinstalada. O Keyhound filtra em três camadas antes de reportar:
- caminhos listados no
.keyhoundignore - valores que são claramente placeholder (
xxxx,<your-key>,${API_KEY},CHANGEME) - chaves de exemplo que circulam em documentação oficial
Crie um .keyhoundignore na raiz do projeto:
tests/fixtures/
**/*.lock
docs/exemplos/
Desenvolvimento
git clone https://github.com/felipedelyra-arch/keyhound.git
cd keyhound
python -m venv .venv && source .venv/bin/activate
pip install -e ".[dev]"
pytest
Contribuindo
Veja CONTRIBUTING.md. Regras novas para serviços brasileiros são especialmente bem-vindas.
Licença
Apache License 2.0 — veja LICENSE.
Release files for keyhound 0.2.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| keyhound-0.2.0.tar.gz | 16.4 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| keyhound-0.2.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 33.4 kB
Release files / keyhound-0.2.0.tar.gz
| Download URL | keyhound-0.2.0.tar.gz |
|---|---|
| Size | 16.4 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
54a317d2a3291596affcf35c3b6cad75c75ad96e53ac76c4e234132e65177bbb
|
|
BLAKE2b-256 checksum How to use checksums |
51a54879e76171e160d9a2d9fef111434d636078c3c25a2446ab5fabb03856d6
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.12.3
|
Release files / keyhound-0.2.0-py3-none-any.whl
| Download URL | keyhound-0.2.0-py3-none-any.whl |
|---|---|
| Size | 17.0 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
62697ac99da82f92a32288bd1f317d80fa403c5236f161f7fc58292372c8d8ed
|
|
BLAKE2b-256 checksum How to use checksums |
11b8e44806b91e8d3ea38bf4b3849b1a2c19439fd360af47402741bfa6470bf1
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.12.3
|