"""Utilidades de cifrado para passwords usando DPAPI en Windows.""" import base64 import win32crypt from typing import Optional def encrypt_password(password: str) -> str: """ Cifra una contraseña usando DPAPI de Windows. Args: password: Contraseña en texto plano Returns: Contraseña cifrada en base64 """ if not password: return "" try: encrypted_bytes = win32crypt.CryptProtectData( password.encode('utf-8'), None, None, None, None, 0 ) return base64.b64encode(encrypted_bytes).decode('ascii') except Exception as e: raise RuntimeError(f"Error cifrando contraseña: {e}") def decrypt_password(encrypted_password: str) -> str: """ Descifra una contraseña usando DPAPI de Windows. Args: encrypted_password: Contraseña cifrada en base64 Returns: Contraseña en texto plano """ if not encrypted_password: return "" try: encrypted_bytes = base64.b64decode(encrypted_password) decrypted_bytes = win32crypt.CryptUnprotectData( encrypted_bytes, None, None, None, 0 )[1] return decrypted_bytes.decode('utf-8') except Exception as e: raise RuntimeError(f"Error descifrando contraseña: {e}")