A04: Fallas Criptograficas
¿Que es una falla criptografica?
Las Fallas Criptograficas ocurren cuando una aplicacion maneja mal secretos, cifrado, hashing o gestion de llaves y expone datos.
Laravel 12 documenta el uso de la llave de la aplicacion y soporta llaves previas via APP_PREVIOUS_KEYS; tambien provee servicios de cifrado y hashing seguro con Bcrypt y Argon2.
Fallo tipico en Laravel
- Guardar secretos o tokens en texto plano.
- Cifrar de forma inconsistente.
- Gestion de llaves debil.
- Confundir hashing con cifrado.
- Rotar llaves mal.
Impacto
- Exposicion de credenciales (passwords, API tokens) y toma de cuentas.
- Exposicion de datos sensibles (PII) si falta el cifrado o esta mal implementado.
- Perdida permanente de acceso a datos cifrados por rotacion incorrecta de llaves.
- Incidentes mas graves cuando secretos terminan en logs.
Remediacion en Laravel 12
- Usa
Hashpara passwords (one-way), nunca cifrado. - Usa
Cryptsolo para valores sensibles que deban ser descifrables. - Protege y rota
APP_KEYcorrectamente. - Usa
APP_PREVIOUS_KEYSdurante la rotacion para no romper valores cifrados antiguos. - Nunca loguees secretos, seeds de OTP, reset tokens, API tokens, ni datos personales sin procesar.
Arreglo concreto
Rota APP_KEY de forma segura usando APP_PREVIOUS_KEYS para que valores cifrados antiguos sigan siendo descifrables:
# .env (ejemplo) # Nueva llaveAPP_KEY=base64:NUEVA_LLAVE_AQUI # Una o mas llaves anteriores, separadas por comasAPP_PREVIOUS_KEYS=base64:LLAVE_ANTIGUA_1,base64:LLAVE_ANTIGUA_2
Hashea passwords:
use Illuminate\Support\Facades\Hash; $password = Hash::make($request->password);
Cifra valores sensibles descifrables:
use Illuminate\Support\Facades\Crypt; $encrypted = Crypt::encryptString($sensitiveValue);
Enfoque de patron de diseno
Centraliza la criptografia detras de un servicio/puerto pequeno para estandarizar criterios, soportar rotacion de llaves y poder cambiar Crypt por una implementacion basada en KMS/HSM si lo necesitas.
Evita dispersar Crypt::encryptString(...) en controllers y modelos.
interface SensitiveValueCipher{ public function encrypt(string $plain): string; public function decrypt(string $cipher): string;} final class LaravelCipher implements SensitiveValueCipher{ public function encrypt(string $plain): string { return \Illuminate\Support\Facades\Crypt::encryptString($plain); } public function decrypt(string $cipher): string { return \Illuminate\Support\Facades\Crypt::decryptString($cipher); }}