60 lines
1.4 KiB
Python
60 lines
1.4 KiB
Python
"""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}")
|