¿Cuál es la probabilidad de colisión de MD5 cuando se eliminan los valores no numéricos?

0
  1. Comience con un identificador único

    String macAddress = "CC:3A:61:24:D6:96";

  2. Hash el identificador a través de la implementación MD5

    String hash = md5(macAddress); //bd37f780e10244cf28810b969559ad5b

  3. Eliminar todas las letras del hash

    String result = hash.replaceAll("[^\d.]", "");

    result == "3778010244288109695595"

Estoy utilizando MD5 para anonimizar las direcciones MAC de nuestros usuarios. Nuestro servicio web actual no acepta letras por el valor que deseo establecer, por lo que simplemente las quité. No creo que esto incremente las posibilidades de una colisión dentro de nuestra base de datos, por lo que vengo aquí con la pregunta:

¿Qué tan probable es que result colisione con una entrada macAddress diferente en comparación con hash ?

    
pregunta kiansheik 18.07.2014 - 20:30
fuente

2 respuestas

2

No confíes demasiado en el anonimato. De hecho, direcciones MAC caben en 48 bits, de los cuales dos se utilizan por razones administrativas, dejando solo 46 bits (como máximo ) Desconocido para alguien ansioso por recuperar las direcciones MAC (de hecho, el atacante puede asumir que la dirección MAC de una máquina física de usuario será "unicast" y "globalmente única", por lo que los dos bits menos significativos del primer byte serán 0 ).

Una buena GPU podrá calcular más de 2 33 por segundo (vea los puntos de referencia aquí ; la máquina con 8 AMD R9 290X alcanza más de 93 billones de MD5 por segundo); para que una sola GPU disponible en el mercado pueda atravesar el espacio completo de 2 46 en un par de horas.

Y lo que es más importante, recuperar direcciones MAC para rastrear personas solo tiene sentido para un atacante que tiene direcciones MAC conocidas para rastrear. El atacante no necesita usar todas las 2 46 posibles direcciones MAC, solo las pocas docenas (o cientos o miles o incluso millones) que está tratando de seguir. Una computadora portátil básica, sin GPU en absoluto, puede hacer eso en una fracción de segundo.

Dicho esto, la pregunta que hiciste todavía tiene sentido matemáticamente. Si asumimos que las salidas de MD5 son valores "en su mayoría aleatorios" en el espacio 2 128 , entonces cada carácter en la cadena hexadecimal tiene una probabilidad 10/16 de ser un dígito, independientemente de los otros dígitos. Todas las entradas posibles caerán en una de las 33 categorías para las 33 longitudes posibles para las cadenas resultantes (de 0 a 32 dígitos). La probabilidad de que una salida MD5 caiga en la categoría n , es decir, que contenga n dígitos y 32- n no dígitos, es:

Pn = (32! / ( n ! (32- n )!)) · (10/16) n · (6/16) 32- n

En promedio, si hash k direcciones MAC, obtendrás zn = k · P n en la categoría n , y puede esperar una colisión cuando ese número z n comienza a acercarse a la raíz cuadrada del espacio de valores posibles en esa categoría, es decir, 10 n . En otras palabras, cuando k alcanza 10 n / 2 / P n para algunos n , estás en problemas.

Vamos a obtener algunos números en eso; El umbral para las distintas categorías es:

n =  0  ->           42756232765793.7
n =  1  ->            2535132744529.3
n =  2  ->             310327495880.8
n =  3  ->              58880502453.6
n =  4  ->              15409365312.7
n =  5  ->               5220931252.0
n =  6  ->               2201337901.8
n =  7  ->               1124508269.7
n =  8  ->                682753416.9
n =  9  ->                485787572.5
n = 10  ->                400746570.8
n = 11  ->                380181578.5
n = 12  ->                412196472.8
n = 13  ->                508357082.1
n = 14  ->                710713497.4
n = 15  ->               1123736707.7
n = 16  ->               2006720463.1
n = 17  ->               4045452147.9
n = 18  ->               9210846925.9
n = 19  ->              23717908021.4
n = 20  ->              69233179091.0
n = 21  ->             229881262361.1
n = 22  ->             872338056547.2
n = 23  ->            3806833704700.6
n = 24  ->           19261224288561.1
n = 25  ->          114205011141017.5
n = 26  ->          804844014914874.4
n = 27  ->         6871878670370940.0
n = 28  ->        73015449033077408.0
n = 29  ->      1004393786461416580.0
n = 30  ->     19057032197633204000.0
n = 31  ->    560451732845470400000.0
n = 32  ->  34028236692093846000000.0

Línea inferior: cuando hash las direcciones MAC con tu regla de "eliminar letras del hexadecimal", deberías ver aparecer la primera colisión cuando hasheado aproximadamente 380 millones de direcciones; se espera que las primeras colisiones sean para cadenas resultantes de longitud de 10 a 12 caracteres.

Si bien 380 millones aún es un número grande, está considerablemente por debajo de los valores que normalmente se esperan de una función hash con 128 bits de salida; si de alguna manera mantuvieras la salida real de MD5, estarías a salvo hasta que aproximadamente 2 64 hayan introducido direcciones MAC, es decir, mucho más de lo que realmente es posible, ya que solo hay 2 48 posibles direcciones MAC (2 46 en la práctica, como se explicó anteriormente).

Por lo tanto, , si desea hacer un hash de las direcciones MAC, le sugiero encarecidamente que no elimine las letras. En cambio, si debe tener dígitos y solo dígitos, utilice una codificación que mantenga toda la información. La salida MD5 es de 16 bytes; La representación hexadecimal de 32 caracteres es solo eso: una representación. Podrías usar una representación alternativa que produce solo dígitos. Por ejemplo, podría interpretar el valor MD5 como un entero grande y codificarlo en la base 10. El código Java correspondiente se vería así:

// MD5 output is a byte[], in variable md5out
String result = new BigInteger(1, md5out).ToString();

Dado que la salida de MD5 es de 16 bytes, el entero resultante se ajustará a un máximo de 39 dígitos.

Pero recuerde lo que escribí al principio: como un sistema de anonimización para las direcciones MAC, una función hash no es una herramienta muy buena ... en su mayoría frustrará a los informantes informales, pero ¿por qué estaría interesado en las direcciones MAC? de todas formas ? No es una información que pueda utilizar "a través de Internet". Los atacantes competentes que están en posición de explotar direcciones MAC, por otro lado, podrán ver a través de una capa anónima de este tipo.

    
respondido por el Tom Leek 18.07.2014 - 21:44
fuente
0

La suma de comprobación MD5 promedio expresada como una cadena hexadecimal (como lo está haciendo) tiene 20 dígitos y 12 letras. Eliminar las letras significa que su MD5 modificado tiene aproximadamente 10 ^ 20 o 2 ^ 66 bits de salida. Las probabilidades de una colisión son la raíz cuadrada del espacio de salida, o alrededor de 2 ^ 33: necesitas, en promedio, 8.5 mil millones de direcciones MAC para generar una colisión.

Para tus propósitos, esto es probablemente lo suficientemente bueno. Si necesitara almacenar todas las 2 ^ 64 direcciones MAC posibles, no lo sería (pero tampoco lo haría el MD5 no modificado).

    
respondido por el Mark 18.07.2014 - 21:43
fuente

Lea otras preguntas en las etiquetas