2010-07-07 34 views
14

Ésta es una pregunta de dos partes:Ayuda con el cálculo (y utilidad) de la entropía contraseña

Parte 1

En primer lugar, se trata de calcular la entropía de una contraseña en PHP. No he podido encontrar ningún ejemplo de código que sea empíricamente sólido y realmente me gustaría obtener ayuda para encontrar la forma "correcta" de calcular un número final. Mucha gente en la red tiene su propio algoritmo de ponderación casero, pero realmente estoy buscando la respuesta científica a la ecuación.

Utilizaré la entropía de contraseñas como solo una parte de un sistema de seguridad más grande y como una forma de analizar nuestra seguridad general de datos basada en información accesible si la contraseña del usuario está comprometida y cuán fácilmente una contraseña puede ser rota por bruto fuerza.

Parte 2

La segunda parte de esta pregunta es: ¿Qué tan útil será este número realmente? Mi objetivo final es generar un "puntaje" para cada contraseña en el sistema que podamos usar para monitorear nuestra seguridad general del sistema como una entidad dinámica. Probablemente tendré que trabajar en otro algoritmo o dos para ataques de diccionario, contraseñas de reemplazo, etc., pero creo que la entropía jugará un papel importante en una calificación del sistema tan general. Sin embargo, doy la bienvenida a sugerencias para otros enfoques.

Lo que sé

he visto alguna mención de ecuaciones logarítmicas para calcular dicho entropía, pero todavía tengo que ver un buen ejemplo que no está escrito en realidad como una ecuación matemática. Realmente podría usar un ejemplo de código (incluso si no es estrictamente en PHP) para ponerme en marcha.

Extensión

Al hacer un comentario me di cuenta de que yo puedo explicar mejor la utilidad de este cálculo. Cuando estoy trabajando en sistemas heredados donde los usuarios tienen contraseñas extremadamente débiles, tengo que tener alguna evidencia concreta de esa debilidad antes de poder presentar un caso para obligar a todos los usuarios a cambiar sus contraseñas a una nueva contraseña fuerte (forzada). Al almacenar un puntaje de seguridad de contraseñas para cada cuenta de usuario en el sistema, puedo construir varias métricas diferentes para mostrar la debilidad general del sistema y defender las contraseñas más sólidas.

TIA

+0

No puedo evitar la entropía, pero he utilizado [cracklib2] (http://www.fifi.org/doc/cracklib2/) con éxito antes. Hay un paquete Pear llamado [crack] (http://pecl.php.net/package/crack) para usar con PHP. – Mike

+0

¿Qué pasa con el voto a favor? Si va a marcarlo, por favor dígame por qué puedo ajustar la pregunta o claificar. – Shane

+2

+1 para contrarrestar un downvote solo porque es una buena pregunta. –

Respuesta

11

La entropía de una cadena ha especificado una definición formal aquí: http://en.wikipedia.org/wiki/Entropy_(information_theory)

¿Qué tan útil que el valor va a ser? Depende. Aquí es un método (en Java) para calcular la entropía que hice para una misión:

public static double entropy() { 
    double h = 0, p; 
    for (int i = 0; i < count.size(); i++){ 
     p = count.get(i)/(totalChars*1.0); 
     h -= p*Math.log(p)/Math.log(2); 
    } 
    return h; 
} 

count es un mapa donde (clave, valor) corresponde a (char, countForChar). Esto obviamente significa que debe procesar la cadena antes de llamar a este método.

EDIT 2: Este es el mismo método, reescrito en PHP

function entropy($string) { 
    $h=0; 
    $size = strlen($string); 
    foreach (count_chars($string, 1) as $v) { 
     $p = $v/$size; 
     $h -= $p*log($p)/log(2); 
    } 
    return $h; 
} 

Datos 3: Hay mucho más para seguridad de la contraseña de la entropía. La entropía se trata de incertidumbre; que no necesariamente se traduce en más seguridad.Por ejemplo:

entropía de "[email protected]!0aj" es 2,5, mientras que la entropía de "password" es 2,75

+0

Gracias por responder, pero conozco la definición de entropía, estoy más interesado en su aplicación con seguridad de contraseñas y cómo lograr eso en PHP. Por ejemplo, probablemente no quiero ejecutar un algoritmo de entropía termodinámico contra contraseñas. LOL – Shane

+1

@Shane - Lo sé. Ver mi edición – quantumSoup

+0

gracias por la actualización, creo que esto ayudará mucho. En su nota sobre seguridad, tiene toda la razón, es por eso que mencioné el uso de esto como parte de un sistema más grande y también haciendo verificaciones de diccionario y tal. Para esta parte, creo que puede funcionar. – Shane

2

forzando un cierto nivel de entropía es un requisito de CWE-521.

(1) Longitud mínima y máxima;
(2) Requiere conjuntos de caracteres mixtos (alfa, numérico, especial, caso mixto);
(3) No contiene nombre de usuario;
(4) Expiración;
(5) Sin reutilización de contraseña.

+0

@Rook - En realidad estaba esperando que pasaras por alto. Fuiste un gran comentarista en otra pregunta que tuve sobre el almacenamiento de contraseñas de texto plano (http://stackoverflow.com/questions/2283937/how-should-i-ethically -approach-user-password-storage-for-later-plaintext-retriev) y pensé que esto sería perfecto. ¿Puede ofrecer más sugerencias sobre las métricas de contraseñas? Estoy tratando de improvisar una forma de supervisar la seguridad general del sistema en base a las contraseñas utilizadas en el sistema. Pensé que la entropía sería un buen lugar para comenzar, pero estoy abierto a otras métricas sugeridas también. – Shane

+0

@Shane En primer lugar, estas reglas van a enojar a la gente, pero serán más seguras. La regla n. ° 2 en CWE-521 se impone mejor utilizando una expresión regular, y esto evitará las contraseñas más comúnmente utilizadas, así como todas las palabras del diccionario y la mejor regla que se puede aplicar. No veo cómo la aplicación de un tamaño máximo ayuda, pero el máximo podría ser de algunos kb de tamaño (¿por qué no?). Para ser sincero, tu pregunta es un tanto extraña, la entropía tiene que ver con el potencial y, al imponer un conjunto de caracteres de mezcla, estás aumentando ese potencial. – rook

+0

@Shane En una nota lateral, CWE-257 es extremadamente importante y no tengo idea de por qué lo está ignorando. Si alguien no conoce su contraseña, entonces no tiene sentido contárselo.Si necesita actualizar el resumen del mensaje utilizado, puede hacerlo en el siguiente inicio de sesión. No hay ** absolutamente nada ** que ganar desde la perspectiva del usuario y te convierte en un objetivo jugoso desde la perspectiva del atacante. – rook

0

Para utilizar la entropía no solo necesita obtener la entropía de Shannon de una sola contraseña, sino también como un elemento en una lista de contraseñas comunes. Si una contraseña es muy parecida a otras contraseñas, su entropía será baja en comparación con otras contraseñas. Si es muy único, será más alto.

Cuestiones relacionadas