<?php
/**
* Generador de contraseñas seguras PHP 8
*
* Autor: David Carrero https://programacion.net
* Original: Daniel Rodríguez Herrera (2003)
*
* Actualizado con random_int(), que obtiene entropía del sistema operativo
* y es criptográficamente seguro, a diferencia de rand() de PHP 4.
*/
/**
* Genera una contraseña aleatoria criptográficamente segura.
*
* @param int $longitud Número de caracteres (8-128)
* @param bool $mayusculas Incluir letras mayúsculas
* @param bool $simbolos Incluir caracteres especiales (!@#$...)
* @return string
*/
function generarPassword(int $longitud = 12, bool $mayusculas = true, bool $simbolos = false): string
{
$chars = 'abcdefghijklmnopqrstuvwxyz0123456789';
if ($mayusculas) {
$chars .= 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
}
if ($simbolos) {
$chars .= '!@#$%^&*()-_=+[]{}|;:,.<>?';
}
$total = strlen($chars);
$password = '';
for ($i = 0; $i < $longitud; $i++) {
// random_int() usa /dev/urandom en Linux: seguro para contraseñas reales.
// rand() y mt_rand() son funciones estadísticas, no criptográficas.
$password .= $chars[random_int(0, $total - 1)];
}
return $password;
}
/**
* Genera un lote de contraseñas con la misma configuración.
*
* @param int $cantidad Número de contraseñas (1-20)
* @param int $longitud Longitud de cada una
* @param bool $mayusculas
* @param bool $simbolos
* @return array<string>
*/
function generarLote(int $cantidad, int $longitud, bool $mayusculas, bool $simbolos): array
{
return array_map(
fn() => generarPassword($longitud, $mayusculas, $simbolos),
range(1, $cantidad)
);
}
// Parámetros de entrada con validación estricta
$longitud = isset($_GET['longitud']) ? max(8, min(128, (int) $_GET['longitud'])) : 12;
$cantidad = isset($_GET['cantidad']) ? max(1, min(20, (int) $_GET['cantidad'])) : 5;
$mayusculas = !empty($_GET['mayusculas']);
$simbolos = !empty($_GET['simbolos']);
header('Content-Type: text/html; charset=utf-8');
?>
<!DOCTYPE html>
<html lang="es">
<head>
<meta charset="utf-8">
<title>Generador de contraseñas seguras</title>
<style>
body { font-family: sans-serif; max-width: 620px; margin: 2rem auto;
padding: 0 1rem; background: #f5f5f5; color: #222; }
h1 { margin-bottom: .25rem; }
form { background: #fff; padding: 1.25rem 1.5rem; border: 1px solid #ddd;
border-radius: 6px; margin-bottom: 1.5rem; }
label { display: inline-block; width: 11rem; }
input[type=number] { width: 5rem; }
input[type=submit] { margin-top: .75rem; padding: .4rem 1.4rem; cursor: pointer; }
.password { font-family: monospace; font-size: 1.1rem; padding: .45rem 1rem;
background: #fff; border-left: 4px solid #0066cc; margin: .35rem 0;
border-radius: 0 4px 4px 0; letter-spacing: .06em; }
small { color: #666; }
</style>
</head>
<body>
<h1>Generador de contraseñas</h1>
<p><small>Usa <code>random_int()</code> criptográficamente seguro (PHP 7+)</small></p>
<form method="get">
<p>
<label for="longitud">Longitud:</label>
<input type="number" id="longitud" name="longitud"
value="<?= $longitud ?>" min="8" max="128">
<small>(8-128)</small>
</p>
<p>
<label for="cantidad">Cantidad:</label>
<input type="number" id="cantidad" name="cantidad"
value="<?= $cantidad ?>" min="1" max="20">
<small>(máx. 20)</small>
</p>
<p>
<label for="mayusculas">Mayúsculas:</label>
<input type="checkbox" id="mayusculas" name="mayusculas"
value="1"<?= $mayusculas ? ' checked' : '' ?>>
</p>
<p>
<label for="simbolos">Símbolos especiales:</label>
<input type="checkbox" id="simbolos" name="simbolos"
value="1"<?= $simbolos ? ' checked' : '' ?>>
</p>
<p><input type="submit" value="Generar contraseñas"></p>
</form>
<h2>Contraseñas generadas</h2>
<?php foreach (generarLote($cantidad, $longitud, $mayusculas, $simbolos) as $pwd): ?>
<div class="password"><?= htmlspecialchars($pwd, ENT_QUOTES, 'UTF-8') ?></div>
<?php endforeach; ?>
</body>
</html>
Generador de contraseñas seguras en PHP 8
Genera contraseñas aleatorias usando random_int(), criptográficamente seguro desde PHP 7. A diferencia de rand() y srand() del código original de 2003, random_int() obtiene entropía del sistema operativo (/dev/urandom en Linux) y es apto para contraseñas reales. Admite configurar longitud (8-128 caracteres), cantidad de contraseñas, uso de mayúsculas y símbolos especiales. Incluye formulario HTML con validación de parámetros.
Descargar adjuntos
COMPARTE ESTE TUTORIAL
COMPARTIR EN FACEBOOK
COMPARTIR EN TWITTER
COMPARTIR EN LINKEDIN
COMPARTIR EN WHATSAPP