Medición e Instrumentación
Construyendo un Javascript contraseña Estrés de fuerza para una mejor seguridad
Table of Contents
La construcción de aplicaciones web seguras requiere más que una seguridad de backend; el extremo frontal juega un papel crítico en guiar a los usuarios hacia un comportamiento más seguro. Una de las maneras más eficaces para mejorar la higiene de contraseña es un medidor de fuerza de contraseña en tiempo real que da retroalimentación inmediata y factible. Mientras el concepto es sencillo, un medidor de producción debe manejar casos de borde, proporcionar señales visuales claras y evitar la confianza falsa.
¿Por qué una contraseña de fuerza de la meter importa
Las contraseñas débiles siguen siendo la causa principal de los compromisos de cuenta. Según el NCSC], muchos usuarios todavía confían en patrones predecibles como "password123". Un medidor de fuerza hace que los usuarios hacia contraseñas más largas y complejas sin exigirles que entiendan los cálculos de la entropía.
Sin embargo, un medidor es tan bueno como su lógica de evaluación. Un medidor mal diseñado podría etiquetar "Password1!" como fuerte (cuando es en realidad común) o desalentar a los usuarios con reglas demasiado estrictas. La mejor complejidad de equilibrio de metros con usabilidad y utilizar múltiples capas de análisis.
Criterios básicos para evaluar la fuerza de contraseña
Antes de escribir código, definir lo que hace que una contraseña "fuerte". Reglas simples como la longitud y la diversidad de caracteres son un comienzo, pero los modelos de amenazas modernos también consideran patrones, palabras de diccionario y sustituciones comunes. Para este proyecto implementaremos un sistema de puntuación basado en los siguientes factores, siguiendo de cerca las pautas de NIST SP 800-63B]:
- Largo: Mínimo 8 caracteres, con recompensas crecientes de hasta 20 caracteres.
- Variedad de caracteres: Maleta superior, minúscula, dígitos, caracteres especiales.
- Características rechazadas: Sanciones para secuencias como "aaaa".
- Patrones comunes: Caminas simples de teclado ("qwerty"), fechas o palabras comunes.
- estimación de la entropía: Posibilidad de la fuerza basada en el posible conjunto de caracteres y la longitud.
Para un sistema de producción, considere la integración de una biblioteca como zxcvbn de Dropbox, que utiliza el análisis de coincidencias y frecuencias de patrón. Para este artículo, construiremos un marcador personalizado que cubra los tres primeros criterios —aunque para muchos casos de uso— y luego mostraremos cómo ampliarlo con zxcvbn.
Arquitectura de la contraseña
El medidor consta de tres capas:
- HTML – Campo de entrada, área de retroalimentación en vivo y una barra de progreso visual.
- Estilamiento de CSS – segmentos codificados por colores e indicadores de accesibilidad.
- JavaScript logic – Actualizaciones de manejo, puntuación e interfaz de usuario con desprestimiento para el rendimiento.
Lo construiremos como un componente independiente que se puede desmontar en cualquier forma. No se requieren marcos – sólo vainilla JavaScript.
Paso 1: Estructura HTML con Accesibilidad en la mente
Utilice HTML5 semántico con regiones para que los lectores de pantalla anuncien cambios de fuerza. El medidor debe incluir tanto una puntuación numérica (tal vez oculta) como una barra de progreso visible.
<div class="password-field">
<label for="password">Choose a password:</label>
<input type="password" id="password" autocomplete="new-password" />
<div class="strength-meter" role="status" aria-live="polite">
<div class="strength-bar" id="strength-bar"></div>
<span class="strength-text" id="strength-text">Weak</span>
</div>
</div>
El asegura que se anuncian cambios dinámicos sin interrumpir al usuario. lo marca como una región en vivo.
Paso 2: CSS Styling para una clara retroalimentación visual
Utilice una barra de progreso gradiente lineal que cambia de color: rojo a amarillo a verde. Incluye una animación sutil para llamar la atención. Mantenlo simple y accesible – asegurar suficiente contraste de color.
.strength-meter {
margin-top: 0.5rem;
height: 1rem;
border-radius: 4px;
background-color: #e0e0e0;
}
.strength-bar {
height: 100%;
width: 0%;
border-radius: 4px;
transition: width 0.3s ease, background-color 0.3s ease;
}
.strength-text {
display: block;
margin-top: 4px;
font-weight: bold;
font-size: 0.9rem;
}
Paso 3: Logic de JavaScript – Algoritm de escobismo
Implementa una función que devuelve una puntuación (0–100) y una etiqueta correspondiente. Recompensaremos la longitud fuertemente, dar puntos para la diversidad de caracteres, y restar para las repeticiones.
function evaluateStrength(password) {
let score = 0;
// Length bonuses (exponential)
if (password.length >= 8) score += 20;
if (password.length >= 12) score += 20;
if (password.length >= 16) score += 20;
if (password.length >= 20) score += 20;
// Character variety
if (/[a-z]/.test(password)) score += 5;
if (/[A-Z]/.test(password)) score += 5;
if (/[0-9]/.test(password)) score += 5;
if (/[^a-zA-Z0-9]/.test(password)) score += 10;
// Penalty for repeated characters (3+ consecutive same)
const repeats = password.match(/(.)\1{2,}/g);
if (repeats) {
const penalty = repeats.reduce((acc, seq) => acc + seq.length, 0) * 2;
score = Math.max(0, score - penalty);
}
// Clamp score to 0–100
return Math.min(100, Math.max(0, score));
}
function getStrengthLabel(score) {
if (score < 30) return 'Weak';
if (score < 60) return 'Moderate';
if (score < 85) return 'Strong';
return 'Very Strong';
}
Este algoritmo es ligero y funciona en milisegundos incluso en contraseñas largas. Para una aplicación de producción, considere agregar evaluación basada en el tiempo fuera para evitar bloquear el hilo principal en entradas extremadamente largas (aunque raras).
Paso 4: Deberuncing Input Events
La evaluación de cada pulsador puede causar problemas de rendimiento, especialmente si se integra con una biblioteca pesada como zxcvbn. Utilice una función de desprestigio para retrasar la evaluación hasta que el usuario deje de escribir para 300ms.
const input = document.getElementById('password');
const strengthBar = document.getElementById('strength-bar');
const strengthText = document.getElementById('strength-text');
let debounceTimer;
input.addEventListener('input', function() {
clearTimeout(debounceTimer);
debounceTimer = setTimeout(() => {
const score = evaluateStrength(this.value);
updateUI(score);
}, 300);
});
function updateUI(score) {
const label = getStrengthLabel(score);
strengthBar.style.width = score + '%';
strengthBar.style.backgroundColor = getColor(score);
strengthText.textContent = label;
}
function getColor(score) {
if (score < 30) return '#e53935'; // red
if (score < 60) return '#fb8c00'; // orange
if (score < 85) return '#43a047'; // green
return '#1b5e20'; // dark green
}
Paso 5: Mejora avanzada – Integrando zxcvbn
Los evaluadores personalizados pierden patrones de contraseña comunes. La biblioteca zxcvbn de Dropbox utiliza un diccionario de frecuencia y un patrón que coinciden para producir una puntuación más precisa. Para integrarlo, cargar la biblioteca a través de CDN y reemplazar la lógica de evaluación manteniendo la misma interfaz de usuario.
<script src="https://cdnjs.cloudflare.com/ajax/libs/zxcvbn/4.4.2/zxcvbn.js"></script>
Entonces en el retracto de la descaro:
const result = zxcvbn(this.value);
const score = result.score; // 0-4
updateUI(score * 25); // map to 0-100
También puede mostrar sugerencias de para guiar a los usuarios hacia contraseñas más fuertes.
Paso 6: Integración de formularios y retroalimentación
No pare en el medidor. Enlace a la manilladora de envío del formulario. Si la puntuación de la contraseña es demasiado baja, prevenga la presentación y muestre un mensaje. También implemente una "Mostrar contraseña" para que los usuarios puedan ver su entrada – esto reduce la frustración.
const showToggle = document.getElementById('show-password');
showToggle.addEventListener('change', function() {
input.type = this.checked ? 'text' : 'password';
});
document.querySelector('form').addEventListener('submit', function(e) {
const score = evaluateStrength(input.value);
if (score < 30) {
e.preventDefault();
alert('Password is too weak. Please choose a stronger one.');
}
});
Consideraciones de seguridad
Un medidor de fuerza de lado cliente es útil para UX pero nunca lo trata como un mecanismo de seguridad. Siempre aplicar políticas de contraseña sólidas en el lado servidor. Nunca transmitir la contraseña de texto simple al servidor para la evaluación – que la expondría en tránsito. Use HTTPS y hashing (bcrypt, argon2) para almacenamiento. El medidor no debe registrar ni almacenar la contraseña de ninguna manera.
También considera que la retroalimentación del medidor podría ser utilizada por un atacante para reducir el espacio de contraseña si pueden observar la salida de la interfaz de usuario. En entornos de alta seguridad, puede que desee restringir la retroalimentación de la fuerza o utilizar estimaciones de entropía sin revelar la puntuación exacta.
Pruebas de la contraseña
Escribe pruebas de unidad para la función de puntuación usando casos comunes de prueba:
- "password" → Boca (score < 30)
- "¡P@ssw0rd123!" → Fuerte (score > 60)
- "a" → Depósito
- "Correct-Horse-Battery-Staple" → Muy Fuerte
- "1111111111" → Debilidad (repetición de caracteres penal)
Prueba la accesibilidad usando la navegación del teclado y los lectores de pantalla. La región debe anunciar cambios de fuerza después de una breve pausa.
Optimizaciones del rendimiento
Si utiliza zxcvbn, considere cargarlo de forma asincrónica con el atributo dinámico de importación o aplazamiento. Para contraseñas muy largas (100+ caracteres), limite la evaluación a los primeros 100 caracteres para evitar desaceleraciones. Deber de seguir siendo crítico – establecer el retraso a 250–400ms. En dispositivos móviles, considere reducir el tiempo de desprestigio a 200ms para la capacidad de respuesta.
Personalización y Teming
Permitir a los desarrolladores anular los colores, los umbrales y los pesos de puntuación a través de un objeto de configuración. Proporcionar una interfaz de llamada para que el medidor pueda integrarse con generadores de contraseña, listas de contraseña comunes o calculadoras de entropía.
function createStrengthMeter(inputEl, options = {}) {
const config = {
minLength: options.minLength || 8,
colors: options.colors || ['#e53935', '#fb8c00', '#43a047', '#1b5e20'],
thresholds: options.thresholds || [30, 60, 85]
};
// ... rest of the plugin logic
}
Conclusión
Construir un medidor de fuerza de contraseña JavaScript es una forma práctica de mejorar la seguridad del usuario sin añadir fricción. Los ejemplos de este artículo proporcionan una base sólida: un algoritmo de puntuación, manejo de eventos desmontados, HTML accesible y retroalimentación visual. Para aplicaciones de producción, considere la integración de zxcvbn para la detección de patrones avanzados y siempre emparejar el medidor con políticas de contraseñas de servidor.