- .claude/skills/plane-abgleich/SKILL.md - .vault-tools/geheimnis-scan/LIESMICH.md - .vault-tools/geheimnis-scan/datei_scan.py - .vault-tools/geheimnis-scan/push_scan.py Erzeugt vom PostToolUse-Hook .vault-tools/auto-push/auto_push.py. Co-Authored-By: Claude Opus 5 <[email protected]>
44 lines
2.0 KiB
Python
44 lines
2.0 KiB
Python
"""Zählt in einer Textdatei Muster für Zugangsdaten, Firmennamen, Adressen und Mailadressen.
|
|
|
|
Ersteller: Claude (Opus 5.5) · Erstellt: 2026-10-15 · Doku: LIESMICH.md
|
|
|
|
Gibt je Muster die Zahl der Treffer und die verschiedenen Treffer aus; Werte, die
|
|
wie Geheimnisse aussehen, nur als Länge. Aufruf: python -I -X utf8 datei_scan.py <datei>
|
|
"""
|
|
import re
|
|
import sys
|
|
from collections import Counter
|
|
from pathlib import Path
|
|
|
|
text = Path(sys.argv[1]).read_text(encoding="utf-8", errors="replace")
|
|
|
|
# Muster, deren Treffer nur gezählt und als Länge gezeigt werden
|
|
GEHEIM = {
|
|
"schluesselwort_mit_wert": r"(?i)\b(pass(?:wor[dt])?|kennwort|pwd|token|secret|api[_-]?key|client[_-]?secret|bearer)\b\s*[:=]\s*['\"]?([^\s'\",;]{6,})",
|
|
"private_key_block": r"-----BEGIN [A-Z ]*PRIVATE KEY-----",
|
|
"lange_hex_oder_base64": r"\b[A-Za-z0-9+/]{40,}={0,2}\b",
|
|
}
|
|
# Muster, deren Treffer im Klartext gezeigt werden (Analyse, nicht für Ablage)
|
|
OFFEN = {
|
|
"firma": r"\b[A-ZÄÖÜ][\w&.-]*(?:\s+[A-ZÄÖÜ][\w&.-]*){0,3}\s+(?:GmbH|AG|KG|SE|e\.V\.|UG|Inc\.?|Ltd\.?)\b",
|
|
"mail": r"\b[\w.+-]+@[\w-]+(?:\.[\w-]+)+\b",
|
|
"ipv4": r"\b(?:\d{1,3}\.){3}\d{1,3}\b",
|
|
"guid": r"\b[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}\b",
|
|
"domain": r"\bhttps?://([\w.-]+)",
|
|
"unc_pfad": r"\\\\[\w.-]+\\[\w$.-]+",
|
|
}
|
|
|
|
print(f"Datei: {len(text)} Zeichen, {text.count(chr(10))} Zeilen")
|
|
for name, muster in GEHEIM.items():
|
|
treffer = re.findall(muster, text)
|
|
werte = [t[-1] if isinstance(t, tuple) else t for t in treffer]
|
|
print(f"[geheim] {name}: {len(werte)} Treffer, Längen {sorted(Counter(len(w) for w in werte).items())[:15]}")
|
|
if name == "schluesselwort_mit_wert":
|
|
for schluessel, n in Counter(t[0].lower() for t in treffer).most_common():
|
|
print(f" Schlüssel {schluessel!r}: {n}")
|
|
for name, muster in OFFEN.items():
|
|
zaehl = Counter(re.findall(muster, text))
|
|
print(f"[offen] {name}: {sum(zaehl.values())} Treffer, {len(zaehl)} verschieden")
|
|
for wert, n in zaehl.most_common(40):
|
|
print(f" {n:4d} {wert}")
|