Skip Content

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 Hash para passwords (one-way), nunca cifrado.
  • Usa Crypt solo para valores sensibles que deban ser descifrables.
  • Protege y rota APP_KEY correctamente.
  • Usa APP_PREVIOUS_KEYS durante 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 llave
APP_KEY=base64:NUEVA_LLAVE_AQUI
 
# Una o mas llaves anteriores, separadas por comas
APP_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);
}
}

Referencias