Phpost
COMPLEMENTOS HIBP Password Check v1.0 - Versión para impresión

+- Phpost (https://phpost.es)
+-- Foro: Risus Nova 2.0 (https://phpost.es/forum-150.html)
+--- Foro: Complementos (https://phpost.es/forum-164.html)
+---- Foro: Terminados (https://phpost.es/forum-165.html)
+---- Tema: COMPLEMENTOS HIBP Password Check v1.0 (/thread-1018.html)



HIBP Password Check v1.0 - Tronlar - 05-31-2026

HIBP Password Check v1.0
Para Risus Nova 2.0 — PHPost


Verifica automáticamente si la contraseña que elige un usuario ha aparecido en filtraciones de datos conocidas, usando la API de Have I Been Pwned — la base de datos más completa del mundo con más de 800 millones de contraseñas comprometidas.

Si la contraseña está en la lista, se muestra un aviso y se pide al usuario que elija otra. Si la API no responde, se deja pasar sin bloquear al usuario.




🔒 Características
   


🛡️ ¿Cómo funciona la privacidad?

La contraseña nunca se envía a ningún servidor externo. El proceso es:
 
  1. Se calcula el hash SHA1 de la contraseña localmente
  2. Solo se envían los primeros 5 caracteres del hash a HIBP
  3. HIBP devuelve una lista de hashes que empiezan por esos 5 caracteres
  4. El servidor comprueba localmente si el hash completo está en la lista

Esto se llama k-anonymity y es el método oficial recomendado por HIBP



🛠️ Instalación

Paso 1 — En c.cuenta.php

Buscar:
 
Código:
/*
        loadBloqueos()
    */


Arriba agregar:
 
Código:
public static function checkHIBP($password) {
    $sha1   = strtoupper(sha1($password));
    $prefix = substr($sha1, 0, 5);
    $suffix = substr($sha1, 5);

    $ctx = stream_context_create([
        'http' => [
            'timeout'       => 3,
            'ignore_errors' => true,
            'header'        => "User-Agent: Risus-Nova-HIBP/1.0\r\n",
        ],
    ]);

    $response = @file_get_contents(
        'Registrate o inicia tu sesión para ver este contenido . $prefix,
        false, $ctx
    );

    if ($response === false) return false;

    foreach (explode("\n", $response) as $line) {
        $parts = explode(':', trim($line));
        if (isset($parts[0]) && strtoupper($parts[0]) === $suffix) {
            return (int)($parts[1] ?? 1) > 0;
        }
    }
    return false;
}


Paso 2 — En c.cuenta.php

Buscar:
 
Código:
elseif(strlen($new_passwd) < 5) return array('error' => 'Contrase&ntilde;a no v&aacute;lida.');


Debajo agregar:
 
Código:
elseif(self::checkHIBP($new_passwd)) return array('error' => 'Esta contrase&ntilde;a ha aparecido en filtraciones de datos conocidas. Por seguridad elige una diferente.');


Paso 3 — En c.registro.php

Buscar:
 
Código:
 $key = defined('PASSWORD_ARGON2ID')


Agregar debajo:
 
Código:
// HIBP — Verificar contraseña filtrada
if(!class_exists('tsCuenta')) require_once TS_CLASS . 'c.cuenta.php';
if(tsCuenta::checkHIBP($tsData['user_password'])) return 'password: Esta contraseña ha aparecido en filtraciones de datos conocidas. Por seguridad elige una diferente.';
 



✅ Resultado

Si el usuario intenta usar una contraseña filtrada verá:
Cita:Esta contraseña ha aparecido en filtraciones de datos conocidas. Por seguridad elige una diferente.
 

 
¿Tienes dudas o encuentras algún problema? Déjalo en los comentarios.