Files
aza/AzA march 2026/security/handovers/STEP_4_2a_HASHING_PROOF.md
2026-03-25 22:03:39 +01:00

4.8 KiB
Raw Blame History

STEP 4.2a HASH-MIGRATION PROOF (AUDIT-NACHWEIS)

Status: PASS


Test-Setup

  • Datei: basis14.py (Zeilen 12981316)
  • Speicherort: kg_diktat_user_profile.json (JSON, Feld password_hash)
  • Testmethode: Automatisiertes Python-Skript mit Backup/Restore des Original-Profils
  • KDF: bcrypt, cost=12, Salt eingebettet
  • Legacy: SHA-256, 64 Hex-Zeichen, kein Salt
  • Testpasswörter: AuditTest2026! (korrekt), FalschesPasswort (falsch)

Test 1: Legacy-SHA-256-User anlegen

Passwort:     AuditTest2026!
SHA-256 Hash: e99f0f4a91440e4a7d89ebd1db548df0eed586dd16e1b3c0e9bb6356220e0f3b
Speicherort:  kg_diktat_user_profile.json
Prüfung Ergebnis
Profil gespeichert PASS
Hash ist Legacy (64 hex chars) PASS
Hash Länge = 64 PASS
Hash beginnt NICHT mit 2b PASS

Test 2: Login mit falschem Passwort

Passwort: FalschesPasswort
Ergebnis: REJECTED
Prüfung Ergebnis
Falsches PW abgelehnt PASS

Test 3: Login mit korrektem Passwort + Rehash

VORHER (Legacy SHA-256):

e99f0f4a91440e4a7d89ebd1db548df0eed586dd16e1b3c0e9bb6356220e0f3b

NACHHER (bcrypt):

$2b$12$mM1wNUuQJfYMZ23xJRfsJO/JVI0G4ucm9lT.BnTK/LVK8m/gw6CEK
Prüfung Ergebnis
Korrektes PW akzeptiert PASS
Hash hat sich geändert PASS
Neuer Hash beginnt mit 2b PASS
Neuer Hash ist NICHT Legacy PASS

Test 4: Login nach Rehash (bcrypt-Hash)

Prüfung Ergebnis
Korrektes PW nach Rehash PASS
Falsches PW nach Rehash abgelehnt PASS

Test 5: Neue Registrierung → direkt bcrypt

Neues Passwort: NeuerUser2026!
bcrypt Hash:    $2b$12$MdhU4H6CihlPMecPxRGgHuZ0rRJw.QXd1B0tqr4A8xK...
Prüfung Ergebnis
Hash ist bcrypt PASS
Hash ist NICHT Legacy PASS
Verify korrekt PASS
Verify falsch abgelehnt PASS

Test 6: Passwortänderung → bcrypt

Neuer Hash: $2b$12$62I3tJxk09DaPmmu.6SsEeTgSp6UJReaJtSzs57SFO6...
Prüfung Ergebnis
Hash ist bcrypt PASS
Altes PW abgelehnt PASS
Neues PW akzeptiert PASS

Code-Verifikation

_hash_password() Zeile 12981301

@staticmethod
def _hash_password(pw: str) -> str:
    return bcrypt.hashpw(pw.encode("utf-8"), bcrypt.gensalt(rounds=12)).decode("utf-8")

→ Erzeugt bcrypt-Hash mit cost=12 und eingebettetem Salt.

_verify_password() Zeile 13031309

@staticmethod
def _verify_password(pw: str, stored_hash: str) -> bool:
    if stored_hash.startswith("$2b$") or stored_hash.startswith("$2a$"):
        return bcrypt.checkpw(pw.encode("utf-8"), stored_hash.encode("utf-8"))
    legacy = hashlib.sha256(pw.encode("utf-8")).hexdigest()
    return legacy == stored_hash

→ Erkennt bcrypt-Hashes am Prefix. Fällt auf SHA-256-Vergleich zurück.

_is_legacy_hash() Zeile 13111316

@staticmethod
def _is_legacy_hash(stored_hash: str) -> bool:
    if not stored_hash:
        return False
    return not stored_hash.startswith("$2") and len(stored_hash) == 64

→ Erkennt alte 64-Zeichen SHA-256-Hashes.

Login mit Rehash Zeile 13631367

stored = self._user_profile.get("password_hash", "")
if self._verify_password(pw, stored):
    if self._is_legacy_hash(stored):
        self._user_profile["password_hash"] = self._hash_password(pw)
        save_user_profile(self._user_profile)
    dlg.destroy()

→ Bei erfolgreichem Login: Legacy-Hash automatisch durch bcrypt ersetzt.

Registrierung Zeile 1465

"password_hash": self._hash_password(pw),

→ Nutzt direkt bcrypt.

Profiländerung (altes PW prüfen) Zeile 1545

if old_hash and not self._verify_password(pw_old_e.get(), old_hash):

→ Verifiziert mit _verify_password (bcrypt + Legacy-kompatibel).

Profiländerung (neues PW setzen) Zeile 1554

pw_hash = self._hash_password(new_pw)

→ Nutzt direkt bcrypt.


Gesamtergebnis

Nr Testfall Ergebnis
1 Legacy-Hash anlegen & erkennen PASS
2 Falsches PW → abgelehnt PASS
3 Korrektes PW → akzeptiert + Rehash PASS
4 Login nach Rehash funktioniert PASS
5 Registrierung schreibt bcrypt PASS
6 Passwortänderung schreibt bcrypt PASS

18/18 Einzelprüfungen: PASS 0 Fixes notwendig Original-Profil wiederhergestellt


Bewertung: PASS

Alle Anforderungen erfüllt:

  • Legacy SHA-256 wird erkannt
  • Login mit korrektem/falschem PW korrekt
  • Rehash passiert automatisch beim Login
  • Nach Rehash ist der gespeicherte Hash bcrypt
  • Neue Registrierungen und Passwortänderungen verwenden direkt bcrypt
  • Kein Forced Reset notwendig