
lista de patrones regex para tokens de oauth / api con la fuente proporcionada
Un escáner con fuentes, probado y con verificación offline para tokens y secretos de OAuth / API. Cada patrón está respaldado por fuentes (documentación primaria del proveedor), probado (muestras positivas + negativas) y verificado (compatible con RE2, comprobado contra ReDoS). Incluye una CLI con niveles de confianza. La fuente de verdad es DATA en build_patterns.py; patterns.json y este archivo se generan a partir de ella.
109 patrones / 64 proveedores / generado 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
Estado de salida: 0 sin hallazgos, 1 hallazgos en o por encima del nivel solicitado, 2 error. Apúntalo a un diff o árbol en CI para bloquear fusiones. Los secretos se redactan en la salida de forma predeterminada.
Acepta hallazgos revisados (fixtures de prueba, ejemplos de documentación) para que CI solo falle ante secretos nuevos:
regextokens scan . --write-baseline .regextokens-baseline.json # snapshot current findings
regextokens scan . --baseline .regextokens-baseline.json # subtract them
La línea base almacena huellas digitales (sha256 del id del patrón + cuerpo del secreto hasheado), nunca los secretos en sí, por lo que es seguro confirmarla en el repositorio. La coincidencia es independiente de la línea — editar por encima de un hallazgo aceptado no lo des-suprime — pero el mismo token en un archivo diferente es una nueva exposición y se reporta. Una sección allow editada manualmente contiene la política: globs de rutas fnmatch e ids de patrones. --write-baseline la preserva y la aplica. Este repositorio confirma su propia línea base que cubre las muestras sintéticas en build_patterns.py; la CI se autoescanea contra ella.
# .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 usan -m probable por defecto: el nivel low incluye identificadores públicos y marcadores de posición que harían inutilizable una compuerta de commits.
Cada hallazgo se puntúa mediante prueba offline — solo computación local, sin red, sin llamadas al emisor. Una coincidencia de forma responde a "¿esto parece un token?"; estas comprobaciones responden a "¿podemos probar, localmente, que lo es o que no lo es?". Filtra con -m/--min-confidence.
verified-offline — una suma de verificación o un decodificador demuestra que la estructura es auténtica (CRC32 de GitHub/npm; validado empíricamente contra tokens revocados reales).probable — estructura más un cuerpo de entropía de Shannon consistente con un secreto real.low — solo coincidencia de forma; puede ser un marcador de posición o un identificador público.rejected — la prueba offline indica que esto es demostrablemente no un token real (p. ej., discrepancia de CRC32); se descarta antes de llegar a ti.El nivel rejected es el diferenciador: una cadena ghp_/npm_ con un prefijo y una longitud válidos pero una suma de verificación incorrecta se descarta con certeza, eliminando la mayor clase de falsos positivos para los proveedores de mayor valor. La prueba offline nunca afirma que una clave esté activa — eso aún requiere la API del emisor.
pip install pytest
pytest # validate every pattern + engine
python build_patterns.py # regenerate patterns.json + README.md
Consumir el catálogo directamente (sin motor):
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 — fuente de verdad (DATA) + validador; reconstruye patterns.json y README.md.patterns.json — catálogo generado (legible por máquina). Nunca editar a mano.regextokens/ — paquete instalable: catalog (carga), scanner (recorrido/coincidencia), verify (prueba offline), baseline (hallazgos aceptados + allowlist), report (humano/JSON/SARIF), cli. Incluye una copia sincronizada de patterns.json..pre-commit-hooks.yaml / action.yml / .github/workflows/ — distribución: hook de pre-commit, GitHub Action compuesta, CI + publicación en PyPI activada por tag (trusted publishing).tests/ — test_patterns.py (cada patrón: compilación, coincidencia, RE2, ReDoS) y test_engine.py (scanner, verify, report, CLI, sincronización del catálogo).sniffer-audit.md — auditoría de otros escáneres de secretos (verificación, obsolescencia).references.bib / references.md — bibliografía de la literatura sobre detección de secretos.re de Python. Sin lookbehind ni retroreferencias.re.search (escaneo de texto embebido). Envolver con ^/$ para usarlos como validadores.\b delimitan la mayoría de los tokens. Eliminarlos si se escanea dentro de blobs base64.prefix = fiable por sí solo; structure = forma fija; keyword = condicionado a una palabra clave cercana; identifier = público, no secreto; encoding = comprobación de formato, no secreto.patterns.json son relleno sintético, no credenciales reales.sniffer-audit.md — cómo los principales escáneres construyen y verifican patrones, con datos de benchmark.references.bib / references.md — bibliografía de la literatura sobre detección de secretos.Cadena Base64 [encoding]
^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$
Validador de formato, no un secreto. Alfabeto Base64 estándar con relleno. Anclado.
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,}