Files
claude-werkzeuge/.vault-tools/geheimnis-scan/datei_scan.py
T
Pascal Michel e4963eebe2 Abgleich mit dem Vault-Stand 5c997a2
4 Datei(en) geändert.
Erzeugt von .vault-tools/auto-push/werkzeuge_spiegel.py.
2026-10-16 04:00:04 +02:00

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}")