#!/usr/bin/env python3 """Command line interface around the salt hashing helpers.""" from __future__ import annotations import argparse from typing import Sequence from salt import hash_password, verify_password def _build_parser() -> argparse.ArgumentParser: from algorithms import list_algorithms parser = argparse.ArgumentParser( description="CLI für Password-Hashing (PBKDF2, Argon2, bcrypt) inklusive Verify-Modus." ) subparsers = parser.add_subparsers(dest="command", required=True) generate_parser = subparsers.add_parser( "generate", help="Erzeugt ein neues Salt+Hash Paar." ) generate_parser.add_argument("password", help="Klartext-Passwort zum Hashen.") generate_parser.add_argument( "--algorithm", "-a", choices=list_algorithms(), default="pbkdf2", help="Hash-Algorithmus (Standard: pbkdf2)", ) verify_parser = subparsers.add_parser( "verify", help="Validiert ein Passwort anhand von Salt und Hash.", ) verify_parser.add_argument("password", help="Passwort zum Prüfen.") verify_parser.add_argument("salt", help="Base64-kodiertes Salt.") verify_parser.add_argument("hash", help="Base64-kodierter Hash.") verify_parser.add_argument( "--algorithm", "-a", choices=list_algorithms(), default="pbkdf2", help="Hash-Algorithmus (Standard: pbkdf2)", ) subparsers.add_parser( "list-algorithms", help="Zeigt alle verfügbaren Hash-Algorithmen an." ) return parser def _command_generate(args: argparse.Namespace) -> int: salt, hash_value = hash_password(args.password, algorithm=args.algorithm) print(f"Salt: {salt}") print(f"Hash: {hash_value}") return 0 def _command_verify(args: argparse.Namespace) -> int: if verify_password(args.password, args.salt, args.hash, algorithm=args.algorithm): print("✓ Passwort korrekt") return 0 print("✗ Passwort falsch") return 1 def _command_list_algorithms() -> int: from algorithms import list_algorithms print("Verfügbare Algorithmen:") for algo in list_algorithms(): print(f" - {algo}") return 0 def main(argv: Sequence[str] | None = None) -> int: parser = _build_parser() args = parser.parse_args(argv) if args.command == "generate": return _command_generate(args) if args.command == "list-algorithms": return _command_list_algorithms() return _command_verify(args) if __name__ == "__main__": raise SystemExit(main())