
Liste von Regex-Mustern für OAuth-/API-Tokens mit angegebener Quelle
Ein quellenbasierter, getesteter, offline-nachweisender Scanner für OAuth-/API-Tokens und Secrets. Jedes Muster ist quellenbasiert (primäre Anbieter-Dokumentation), getestet (Positiv- + Negativbeispiele) und nachgewiesen (RE2-kompatibel, auf ReDoS geprüft). Liefert eine CLI mit Konfidenzstufen. Die maßgebliche Quelle ist DATA in build_patterns.py; patterns.json und diese Datei werden daraus generiert.
109 Muster / 64 Anbieter / generiert am 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
Exit-Status: 0 keine Funde, 1 Funde auf/über der angeforderten Stufe, 2 Fehler. Richten Sie es in CI auf einen Diff oder Baum, um Merges zu blockieren. Secrets werden in der Ausgabe standardmäßig redigiert.
Akzeptieren Sie überprüfte Funde (Test-Fixtures, Doku-Beispiele), damit CI nur bei neuen Secrets fehlschlägt:
regextokens scan . --write-baseline .regextokens-baseline.json # snapshot current findings
regextokens scan . --baseline .regextokens-baseline.json # subtract them
Die Baseline speichert Fingerabdrücke (sha256 aus Pattern-ID + gehashtem Secret-Body), niemals die Secrets selbst, sodass sie sicher committet werden kann. Der Abgleich ist zeilenunabhängig — eine Bearbeitung oberhalb eines akzeptierten Fundes hebt dessen Unterdrückung nicht auf —, aber dasselbe Token in einer anderen Datei ist eine neue Offenlegung und wird gemeldet. Ein manuell bearbeiteter allow-Abschnitt enthält die Richtlinie: fnmatch-Pfad-Globs und Pattern-IDs. --write-baseline bewahrt und wendet sie an. Dieses Repo committet seine eigene Baseline, die die synthetischen Beispiele in build_patterns.py abdeckt; CI scannt sich selbst dagegen.
# .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}
Beide standardmäßig auf -m probable: Die Stufe low enthält öffentliche Identifikatoren und Platzhalter, die ein Commit-Gate unbrauchbar machen würden.
Jeder Fund wird durch einen Offline-Nachweis bewertet – ausschließlich lokale Berechnung, kein Netzwerk, keine Aufrufe an den Aussteller. Ein Formvergleich beantwortet die Frage „Sieht das wie ein Token aus?“; diese Prüfungen beantworten die Frage „Können wir lokal beweisen, dass es eines ist oder nicht?“ Filtern mit -m/--min-confidence.
verified-offline – eine Prüfsumme oder ein Decoder beweist, dass die Struktur authentisch ist (GitHub/npm CRC32; empirisch gegen echte widerrufene Tokens validiert).probable – Struktur plus ein Shannon-Entropie-Körper, der mit einem echten Secret vereinbar ist.low – nur Formvergleich; kann ein Platzhalter oder öffentlicher Identifikator sein.rejected – der Offline-Nachweis besagt, dass dies nachweislich kein echtes Token ist (z. B. CRC32-Fehlübereinstimmung); wird verworfen, bevor es dich erreicht.Die Stufe rejected ist das Unterscheidungsmerkmal: Ein ghp_/npm_-String mit gültigem Präfix und gültiger Länge, aber fehlerhafter Prüfsumme, wird mit Sicherheit verworfen und eliminiert die größte Klasse von Fehlalarmen bei den wertvollsten Anbietern. Der Offline-Nachweis behauptet nie, dass ein Schlüssel aktiv ist – dafür ist weiterhin die API des Ausstellers erforderlich.
pip install pytest
pytest # validate every pattern + engine
python build_patterns.py # regenerate patterns.json + README.md
Den Katalog direkt konsumieren (keine 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 — Single Source of Truth (DATA) + Validator; erzeugt patterns.json und README.md neu.patterns.json — generierter Katalog (maschinenlesbar). Niemals manuell bearbeiten.regextokens/ — installierbares Paket: catalog (Laden), scanner (Durchlaufen/Abgleichen), verify (Offline-Nachweis), baseline (akzeptierte Funde + Allowlist), report (Human/JSON/SARIF), cli. Enthält eine synchronisierte Kopie von patterns.json..pre-commit-hooks.yaml / action.yml / .github/workflows/ — Distribution: pre-commit-Hook, zusammengesetzte GitHub Action, CI + tag-gesteuerte PyPI-Veröffentlichung (Trusted Publishing).tests/ — test_patterns.py (jedes Muster: Kompilieren, Abgleichen, RE2, ReDoS) und test_engine.py (Scanner, Verify, Report, CLI, Katalog-Synchronisierung).sniffer-audit.md — Audit anderer Secret-Scanner (Verifikation, Veraltung).references.bib / references.md — Bibliografie der Secret-Detection-Literatur.re. Kein Lookbehind oder Backreferences.re.search geschrieben (Scannen eingebetteten Texts). Mit ^/$ umschließen, um sie als Validatoren zu verwenden.\b-Wortgrenzen umschließen die meisten Tokens. Entfernen, wenn innerhalb von Base64-Blobs gescannt wird.prefix = allein zuverlässig; structure = feste Form; keyword = Gate auf ein nahegelegenes Schlüsselwort; identifier = öffentlich, kein Secret; encoding = Formatprüfung, kein Secret.patterns.json sind synthetischer Füllstoff, keine echten Zugangsdaten.sniffer-audit.md — wie große Scanner Muster erstellen und verifizieren, mit Benchmark-Daten.references.bib / references.md — Bibliografie der Secret-Detection-Literatur.Base64-String [encoding]
^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$
Format-Validator, kein Secret. Standard-Base64-Alphabet mit Padding. Verankert.
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,}
Drei base64url-Segmente. Der Header beginnt mit ey (d. h. {"). Dekodieren, um ihn zu prüfen; die Signatur allein ist nicht das Geheimnis.