un

guest
1 / ?
back to lessons

¿Qué hace que un formato de almacenamiento sea recuperable?

Cuatro formatos de almacenamiento, clasificados por recuperabilidad:

| Formato | Recuperable? | Ejemplo | Método de Recuperación |

|--------|-------------|---------|----------------------|

| En claro | Sí | password: hunter2 | Leer el archivo |

| Base64 | Sí | cGFzc3dvcmQ= | base64 --decode |

| Cifrado reversible (AES) | Sí | ENC[AES256:...] | Desencriptar con la clave |

| Hash de un solo sentido (bcrypt) | No | $2b$12$... | No se puede revertir; debe fuerza bruta |

En claro, base64 y cifrado reversible: todos recuperables. Un solo archivo de base de datos proporciona al atacante todas las contraseñas en claro, para todos los usuarios, al mismo tiempo. Un solo breach; exposición total.

El Ejemplo de Mailman 2.x

Mailman 2.x (administrador de listas de correo GNU): almacenaba las contraseñas de suscriptores en claro. Recordatorio de contraseña mensual: enviaba a todos los suscriptores su contraseña en claro. Dos defectos separados, ambos MOAD-0006:

1. Almacenamiento: en claro en la base de datos de la lista. Un compromiso de servidor expone todas las contraseñas de los suscriptores.

2. Transmisión: correo electrónico envía la contraseña en claro sobre SMTP al servidor de correo electrónico del suscriptor. El correo electrónico viaja en claro a través de varios saltos SMTP.

El equipo de Mailman diseñó ambos comportamientos. La recuperación era la función: los suscriptores podían recuperar sus contraseñas olvidadas. El nombre Llave de Vidrio proviene de esto: el seguro almacena las credenciales en forma visible. Cualquiera que llegue al seguro puede leer todos los contenidos al mismo tiempo.

El Principio de ya robado

Una contraseña almacenada en forma recuperable es una contraseña ya robada. El atacante aún no ha llegado. La violación aún no ha ocurrido. Pero la arquitectura garantiza: cuando ocurre una violación, todas las contraseñas caen simultáneamente. No ocurre una violación aislada; todas las contraseñas en almacenamiento recuperable se transfieren al atacante en la misma operación.

MOAD-0006 vs MOAD-0004

MOAD-0004 (Secreto Escrito en el Registro): las contraseñas se escriben en los registros accidentalmente. La escritura en el registro no era la intención; era un efecto secundario de habilitar el registro de encabezados para depuración.

MOAD-0006 (Llave de Vidrio): las contraseñas se almacenan en forma recuperable por diseño. La recuperación era la intención. El recordatorio de contraseña requería almacenar la contraseña. El feature de mostrar la contraseña requería almacenarla. El compromiso arquitectónico con la recuperación creó el defecto.

Diferencia en una línea: MOAD-0004 introduce credenciales en los registros de forma accidental; MOAD-0006 almacena credenciales en forma recuperable con propósito. Las soluciones funcionan en capas diferentes.

Estructural vs Accidental

La distinción arquitectónica entre MOAD-0006 y MOAD-0004 determina la estrategia de solución. Una escritura accidental de logs: corregir el nivel de serialización. Un almacenamiento diseñado para la recuperación: rediseñar la función que requirió la recuperación.

¿Por qué un Safe de Vidrio es estructuralmente diferente de MOAD-0004? Una línea describe cada defecto. ¿Qué significa esto para la solución?

Por qué Funciona bcrypt

Una función de hash uno-direccional acepta una contraseña y produce un digest de longitud fija. Dado el digest, no se puede recuperar la contraseña original. No 'difícil de recuperar': imposible de revertir. La función funciona en una sola dirección.

Tres propiedades requeridas para el almacenamiento de credenciales:

1. Uno-direccional (resistencia a la preimagen). Dado hash(password), ningún algoritmo recupera password más rápido que el ataque por fuerza bruta. bcrypt, scrypt y argon2 satisfacen esta propiedad.

2. Sal. Un valor aleatorio prependido a la contraseña antes de hashearla. La misma contraseña, sal diferente, hash diferente. Propósito: superar las tablas de arcoíris (diccionarios de hashes precalculados). Sin sal: un atacante calcula hash('password123') una vez y verifica a todos los 1 millón de usuarios simultáneamente. Con sal: cada usuario tiene un hash único incluso con la misma contraseña.

3. Lento por diseño. bcrypt acepta un factor de trabajo. Factor de trabajo más alto: más iteraciones, más tiempo de cómputo por intento de hash. Inicio de sesión: 300ms para hash una vez. Aceptable. Force-brute: 300ms por intento. A 1 billón de intentos: 9.5 años por contraseña. Inaceptable para un atacante. La lentitud: una característica, no un defecto.

import bcrypt

# Almacenar: hash unidireccional con sal
def store_password(plaintext: str) -> bytes:
    return bcrypt.hashpw(plaintext.encode(), bcrypt.gensalt(rounds=12))

# Verificar: hash el candidato y comparar los digestos
def verify_password(plaintext: str, stored_hash: bytes) -> bool:
    return bcrypt.checkpw(plaintext.encode(), stored_hash)

# NUNCA almacenado: la contraseña en claro
# NUNCA recuperado: la contraseña en claro desde el hash
# Restaurar contraseña, no recordatorio de contraseña

El Compromiso

La hash unidireccional hace que la recuperación de contraseñas sea imposible. Un usuario que se olvida de su contraseña no puede recibirla de vuelta. Un correo de recordatorio de contraseña no puede existir. El experiencia del usuario cambia: '¿Olvidaste tu contraseña? Restablezla.' No es una degradación: un límite de seguridad. El sistema que no puede recuperar una contraseña no puede revelar una contraseña.

Una brecha en la base de datos que expone hashes bcrypt: todos los hashes visibles, ninguna contraseña visible. Un atacante debe fuerzar la contraseña de cada hash individualmente, a 300ms por intento, con sal por usuario que defrauda las tablas precalculadas. Una brecha que expone contraseñas en claro: exposición total inmediata.

La Encriptación Fuerte No Es Suficiente

Una auditoría de seguridad identifica un sistema de almacenamiento de credenciales. Las contraseñas se almacenan usando AES-256-CBC encriptación con una clave en el lado del servidor. El informe de auditoría lo marca como un defecto Glass Safe.

El equipo de ingeniería responde: 'AES-256 es el cifrado simétrico más fuerte disponible. La clave vive en un módulo de seguridad hardware. Ningún atacante puede descifrar estas contraseñas.'

¿Por qué esto sigue siendo MOAD-0006 incluso con encriptación fuerte? ¿Cuál es la solución correcta?