0
HIBP Password Check v1.0
Para Risus Nova 2.0 — PHPost
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 Debes agradecer para ver el contenido... — 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
- Verificación en el registro y en el cambio de contraseña
- La contraseña nunca sale del servidor — usa k-anonymity (solo se envían los primeros 5 caracteres del hash SHA1)
- Si la API no responde en 3 segundos, se deja pasar sin bloquear
- Sin base de datos ni instalador — solo dos cambios en PHP
- Compatible con PHP 7.4+ y 8.x
🛡️ ¿Cómo funciona la privacidad?
La contraseña nunca se envía a ningún servidor externo. El proceso es:
- Se calcula el hash SHA1 de la contraseña localmente
- Solo se envían los primeros 5 caracteres del hash a HIBP
- HIBP devuelve una lista de hashes que empiezan por esos 5 caracteres
- 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: ( Seleccionar Todo )
/*
loadBloqueos()
*/Arriba agregar:
Código: ( Seleccionar Todo )
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: ( Seleccionar Todo )
elseif(strlen($new_passwd) < 5) return array('error' => 'Contraseña no válida.');Debajo agregar:
Código: ( Seleccionar Todo )
elseif(self::checkHIBP($new_passwd)) return array('error' => 'Esta contraseña ha aparecido en filtraciones de datos conocidas. Por seguridad elige una diferente.');Paso 3 — En c.registro.php
Buscar:
Código: ( Seleccionar Todo )
$key = defined('PASSWORD_ARGON2ID')Agregar debajo:
Código: ( Seleccionar Todo )
// 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.

Facebook
Twitter
Reddit
Digg
del.icio.us
Tumblr
Pinterest
Blogger
Fark
LinkedIn
Mix
Google