Files
password-security-python/salt2.py
2025-11-13 23:56:05 +00:00

90 lines
2.5 KiB
Python

#!/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())