No tengo conocimiento de ningún criptoanálisis publicado en MySQL OLD_PASSWORD()
, pero es tan débil que es una especie de broma. Podría administrarse como un ejercicio durante un curso de criptografía.
Actualización: se publicó un cryptanalysis similar a la reunión en el medio que se describe a continuación en F. Muller y T. Peyrin
"Criptoanálisis de funciones hash basadas en función T"
en la Conferencia Internacional sobre Seguridad de la Información y Criptología - ICISC 2006 en 2006, con una descripción más genérica y algunas optimizaciones para encontrar contraseñas cortas y mantenerlas en la RAM.
Por ejemplo, aquí hay un código C que "revierte" el estado interno:
static int
oldpw_rev(uint32_t *pnr, uint32_t *pnr2, uint32_t add,
unsigned char *cc, unsigned len)
{
uint32_t nr, nr2;
uint32_t c, u, e, y;
if (len == 0) {
return 0;
}
nr = *pnr;
nr2 = *pnr2;
c = cc[len - 1];
add -= c;
u = nr2 - nr;
u = nr2 - ((u << 8) ^ nr);
u = nr2 - ((u << 8) ^ nr);
nr2 = nr2 - ((u << 8) ^ nr);
nr2 &= 0x7FFFFFFF;
y = nr;
for (e = 0; e < 64; e ++) {
uint32_t z, g;
z = (e + add) * c;
g = (e ^ z) & 0x3F;
if (g == (y & 0x3F)) {
uint32_t x;
x = e;
x = y ^ (z + (x << 8));
x = y ^ (z + (x << 8));
x = y ^ (z + (x << 8));
nr = y ^ (z + (x << 8));
nr &= 0x7FFFFFFF;
if (oldpw_rev(&nr, &nr2, add, cc, len - 1) == 0) {
*pnr = nr;
*pnr2 = nr2;
return 0;
}
}
}
return -1;
}
Esta función, cuando se le da el estado interno después de los caracteres de contraseña len
dados en la matriz cc[]
( nr
y nr2
, dos palabras de 31 bits y el valor add
que es la suma de los caracteres de la contraseña), calcula una solución válida para nr
y nr2
antes de la inserción de los caracteres de la contraseña. Esto es eficiente.
Esto conduce a un ataque fácil de encontrar en el medio. Considere las secuencias de 14 letras ASCII en minúsculas, de manera que cada letra vaya seguida de su complemento (el complemento de 'a' es 'z', el complemento de 'b' es 'y', y así sucesivamente ...). Hay alrededor de 8 billones de tales secuencias. Tenga en cuenta que la suma de los caracteres para cualquiera de esas secuencias es siempre el valor fijo 1533. Tome N de esas secuencias; para cada uno de ellos, calcule el hash correspondiente con OLD_PASSWORD()
y acumule los valores en un archivo grande: cada entrada contiene la secuencia de caracteres, y los correspondientes nr
y nr2
. Luego ordene el archivo por el par de 62 bits nr
/ nr2
. Este archivo es una tabla grande de: "utilizando esta secuencia , obtenemos de los valores iniciales a ese estado interno".
Luego toma las secuencias N nuevamente, y esta vez usa oldpw_rev()
(como se muestra arriba) para cada una de ellas, usando el hash real atacado como punto de inicio para nr
y nr2
y 2 * 1533 == 3066 para add
. Esto le dará a usted N otros pares nr
/ nr2
, cada uno con una secuencia correspondiente. Estos valores se acumulan en otro archivo, que nuevamente se ordena por par de 62 bits nr
/ nr2
. Este segundo archivo es una tabla grande de: "usando esta secuencia en ese estado interno, obtenemos el valor de hash que estamos atacando actualmente".
En ese punto, solo tiene que encontrar dos pares coincidentes, es decir, el mismo nr
/ nr2
en el primer archivo y el segundo archivo. Las secuencias de 14 caracteres correspondientes son entonces las dos mitades de una contraseña de 28 caracteres que coincide con la salida de hash. Probablemente sea no la contraseña que se usó en primer lugar, pero esta es una contraseña que tiene el mismo valor y será aceptada por MySQL. Es probable que obtenga un par correspondiente cuando N llegue a 2 billones o menos (estamos en un espacio de tamaño 262 , por lo que basta con que N esté en el orden de sqrt (2 62 ) ).
Este ataque tiene un factor de trabajo sobre 237 (que representa el paso de clasificación), que es mucho más pequeño que el 2 62 factor de trabajo que, en teoría, podría lograrse con una función hash con una salida de 62 bits (que ya es demasiado baja para una seguridad adecuada). Por lo tanto, la función OLD_PASSWORD()
está rota criptográficamente.
(Probablemente hay ataques mucho mejores que eso.)