Volver al inicio
Ciberseguridad & Arquitectura

Adaptador Criptográfico de Identidad

Resolviendo el puente de autenticación entre Laravel 11 y sistemas legacy SIU Toba mediante un motor de hashing adaptativo en PHP 8.3.

El Reto: Experiencia Unificada y Seguridad

Al modernizar ecosistemas universitarios, uno de los mayores desafíos es la fragmentación de identidades. Los usuarios, reacios a gestionar múltiples credenciales, necesitaban acceder a los nuevos módulos de reportes en Laravel 11 utilizando sus cuentas existentes de SIU Toba.

El objetivo estratégico: Implementar un acceso unificado donde el login fuera transparente para el usuario. Esto requería no solo validar los hashes legacy, sino también permitir que el sistema Laravel leyera y respetara los perfiles de acceso definidos originalmente en la base de datos de Toba para restringir permisos de forma quirúrgica.

La Solución: TobaHashAdapter

Desarrollé un Adapter especializado que replica la lógica interna de hashing de Toba pero utilizando las mejores prácticas de PHP 8.3.

Hitos de la Implementación

  • Replica de Algoritmos: Soporte para Bcrypt, SHA256 y SHA512 con el cálculo de rondas exacto que espera Toba.
  • Generación de Sal Segura: Implementación de random_bytes() nativo para máxima entropía, con fallbacks securizados.
  • Interoperabilidad Transparente: Permite al nuevo sistema Laravel verificar contraseñas antiguas y migrarlas automáticamente a estándares más modernos al detectarlas.

Anatomía del Código

El corazón de la solución reside en la codificación precisa de los bytes de la sal y el soporte multi-algoritmo mediante match expressions de PHP 8.

// Implementación del generador de sal adaptativo
private function getSalt(): string
{
    $salt = match (strtoupper($this->metodo)) {
        'BCRYPT' => '$2y$' . sprintf('%02d$', $this->rounds),
        'SHA512' => sprintf('$6$rounds=%d$', $this->calculateRounds()),
        'SHA256' => sprintf('$5$rounds=%d$', $this->calculateRounds()),
        'MD5'    => '$1$',
        default  => throw new Exception("Algoritmo no soportado")
    };

    $bytes = random_bytes(16);
    return $salt . $this->encodeBytes($bytes);
}

// Verificación segura (Constant Time)
public function verify(string $input, string $existingHash): bool
{
    $hash = crypt($input, $existingHash);
    return hash_equals($hash, $existingHash);
}

Métricas de Seguridad

Compatibilidad
100% Legacy
Entropía
CSPRNG

Conclusión

Este adaptador no solo eliminó la fricción de la migración para los usuarios finales, sino que también elevó el estándar de seguridad de la aplicación al centralizar la lógica de hashing en un servicio inyectable, testeable y preparado para futuras actualizaciones de hardware mediante el ajuste dinámico de rondas.