
lista de padrões regex para tokens oauth / api com fonte fornecida
Um scanner com fontes, testado e com prova offline para tokens e segredos de OAuth / API. Cada padrão é com fontes (documentação primária do provedor), testado (amostras positivas + negativas) e provado (compatível com RE2, verificado contra ReDoS). Inclui uma CLI com níveis de confiança. A fonte da verdade é DATA em build_patterns.py; patterns.json e este arquivo são gerados a partir dele.
109 padrões / 64 provedores / gerado em 2026-07-02
pip install -e . # console script + importable package
regextokens scan PATH... # walk files/dirs, report findings
regextokens scan PATH -m verified # only offline-proven findings
regextokens scan PATH -f sarif # SARIF for GitHub code scanning
regextokens list # show the catalog
Status de saída: 0 sem achados, 1 achados no nível solicitado ou acima, 2 erro. Aponte-o para um diff ou árvore no CI para bloquear merges. Segredos são redigidos na saída por padrão.
Aceite achados revisados (fixtures de teste, exemplos de documentação) para que o CI falhe apenas em segredos novos:
regextokens scan . --write-baseline .regextokens-baseline.json # snapshot current findings
regextokens scan . --baseline .regextokens-baseline.json # subtract them
A linha de base armazena impressões digitais (sha256 do id do padrão + corpo do segredo com hash), nunca os próprios segredos, portanto é seguro fazer commit. A correspondência é independente de linha — editar acima de um achado aceito não o des-suprime — mas o mesmo token em um arquivo diferente é uma nova exposição e é reportado. Uma seção allow editada manualmente contém a política: globs de caminho fnmatch e ids de padrão. --write-baseline a preserva e aplica. Este repositório faz commit de sua própria linha de base cobrindo as amostras sintéticas em build_patterns.py; a CI faz auto-varredura com base nela.
# .pre-commit-config.yaml
repos:
- repo: https://github.com/odomojuli/regextokens
rev: v0.2.0
hooks:
- id: regextokens
# .github/workflows/secrets.yml
jobs:
secrets:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: odomojuli/regextokens@main
with:
min-confidence: probable
# baseline: .regextokens-baseline.json
# optional: feed the SARIF to code scanning
# - uses: github/codeql-action/upload-sarif@v3
# if: always()
# with: {sarif_file: regextokens.sarif}
Ambos usam -m probable por padrão: o nível low inclui identificadores públicos e placeholders que tornariam um gate de commit inutilizável.
Cada achado é pontuado por prova offline — apenas computação local, sem rede, sem chamadas ao emissor. Uma correspondência de forma responde "isto parece um token?"; estas verificações respondem "podemos provar, localmente, que é ou não é um?". Filtre com -m/--min-confidence.
verified-offline — um checksum ou decodificador prova que a estrutura é autêntica (CRC32 do GitHub/npm; validado empiricamente contra tokens revogados reais).probable — estrutura mais um corpo de entropia de Shannon consistente com um segredo real.low — apenas correspondência de forma; pode ser um placeholder ou identificador público.rejected — a prova offline indica que isto é comprovadamente não um token real (por exemplo, incompatibilidade de CRC32); descartado antes de chegar até você.O nível rejected é o diferencial: uma string ghp_/npm_ com prefixo e comprimento válidos mas checksum inválido é descartada com certeza, eliminando a maior classe de falsos positivos para os provedores de maior valor. A prova offline nunca afirma que uma chave está ativa — isso ainda requer a API do emissor.
pip install pytest
pytest # validate every pattern + engine
python build_patterns.py # regenerate patterns.json + README.md
Consuma o catálogo diretamente (sem engine):
import json, re
pats = json.load(open("patterns.json"))["patterns"]
rx = {p["id"]: re.compile(p["regex"]) for p in pats}
rx["github-pat-classic"].search(text)
build_patterns.py — fonte da verdade (DATA) + validador; reconstrói patterns.json e README.md.patterns.json — catálogo gerado (legível por máquina). Nunca edite manualmente.regextokens/ — pacote instalável: catalog (carregar), scanner (percorrer/comparar), verify (prova offline), baseline (descobertas aceitas + allowlist), report (humano/JSON/SARIF), cli. Inclui uma cópia sincronizada de patterns.json..pre-commit-hooks.yaml / action.yml / .github/workflows/ — distribuição: hook de pre-commit, GitHub Action composta, CI + lançamento no PyPI acionado por tag (publicação confiável).tests/ — test_patterns.py (cada padrão: compilação, correspondência, RE2, ReDoS) e test_engine.py (scanner, verify, report, CLI, sincronização do catálogo).sniffer-audit.md — auditoria de outros scanners de segredos (verificação, obsolescência).references.bib / references.md — bibliografia da literatura sobre detecção de segredos.re do Python. Sem lookbehind ou referências anteriores.re.search (varredura de texto incorporado). Envolva com ^/$ para usar como validadores.\b delimitam a maioria dos tokens. Remova-os ao varrer dentro de blobs base64.prefix = confiável isoladamente; structure = forma fixa; keyword = condicionado a uma palavra-chave próxima; identifier = público, não secreto; encoding = verificação de formato, não secreto.patterns.json são preenchimento sintético, não credenciais reais.sniffer-audit.md — como os principais scanners constroem e verificam padrões, com dados de benchmark.references.bib / references.md — bibliografia da literatura sobre detecção de segredos.String Base64 [encoding]
^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$
Validador de formato, não um segredo. Alfabeto Base64 padrão com preenchimento. Ancorado.
src: https://datatracker.ietf.org/doc/html/rfc4648#section-4
JSON Web Token (JWT) [structure]
\bey[A-Za-z0-9_-]{10,}\.ey[A-Za-z0-9/_-]{10,}\.[A-Za-z0-9/_-]{10,}
Três segmentos base64url. O cabeçalho começa com ey (ou seja, {"). Decodifique para inspecionar; a assinatura por si só não é o segredo.
src: https://datatracker.ietf.org/doc/html/rfc7519
Bloco de chave privada PEM [prefix]
-----BEGIN (?:RSA |EC |DSA |OPENSSH |PGP |ENCRYPTED )?PRIVATE KEY-----