haskinator, adivina tu edad…

… si estas censado en cataluña y das las cinco ultimas cifras de tu DNI. Al parecer esta es la unica consecuencia del filtrado de datos censales para el 1 de Octubre. Los datos tienen un hash lento que se construye combinando las 5 ultimas cifras del DNI, la letra, la fecha de nacimiento y el codigo postal.

Asi que si vives en barcelona este programa tarda unos 50 minutos en averiguar tu edad a partir del DNI, probando con los 43 distritos y consultando el fichero de hashes.

#!/usr/bin/python
import sys
from hashlib import sha256
from datetime import timedelta,date
with open("somehashes.txt") as f:
  h=set(l.strip() for l in f)

dni=sys.argv[1]
for d in range(1,43):
      distrito="080%02d" %d 
      fecha=date(2017-18,10,1)
      for n in xrange(366*60):
        key=dni+fecha.strftime("%Y%m%d")+distrito
        hash=key
        for m in xrange(1716):
          hash=sha256(hash).hexdigest()
        if hash in h:
          print "una posible coincidencia encontrada"
          print "tu fecha de nacimiento podria ser",fecha.strftime("%Y - %m - %d")
        fecha=fecha-timedelta(1)
      print key 

Por supuesto, si tenemos una tarjeta grafica, los tiempos mejoran. En una geforce 980, que es ya normalilla tirando a antigua, se pueden probar uno o dos distritos por segundo. Para los 43 distritos de Barcelona capital, tomaria un minuto. Que aunque se pueda optimizar algo, es apenas sesenta veces mejor que en python… supongo que esto se debe a que el bucle principal del sha256 se ejecuta practicamente en codigo maquina.

Por supuesto, en general habria que probar con todas las terminaciones de DNI (2300000) y todos los distritos (unos 1000); una sola tarjeta grafica tardaria todavia años. O podriamos contratar GPU en amazon por unas docenas de miles de dolares y terminarlo en una semana. Lo que tampoco tiene mucho sentido porque a estas alturas todas las partes que pudieran tener interes en una bbdd de fechas de nacimiento y dnis seguramente ya la tienen (¡me apuntan en la red que para dnis y direcciones hay micropartidos politicos que filtran ya el censo a comercios!), y esta ni siquiera contiene los DNIs completos

Una prueba de concepto en CUDA: https://github.com/arivero/catchow/tree/master/cuda es capaz de hacer 175000 comprobaciones por segundo en una nvidia K20. El mayor problema en este tipo de codigos es que hay que asegurarse de que empleen muy poca memoria, para que el compilador asigne todo a registros de los cores.

EDIT: Finalmente ha salido el tema publicado en la prensa y me doy cuenta de que no he recopilado enlaces a gente que hablara del tema.


Comments

2 respuestas a «haskinator, adivina tu edad…»

  1. Por cierto, mejorando un poco el uso de registros, tambien es posible subir la velocidad de una tarjeta mas vieja, como la C2050, a 50mil verificaciones por segundo. Asi que posiblemente es mas rapido comprar tiempo de gpu en clouds con equipamiento antiguo.

    He puesto algunas muestras de codigo en https://github.com/arivero/catchow/tree/master/cuda

  2. Con CUDA en amazon, por cierto, incluso despues de poner el reloj al maximo en sus instancias p2 (que se supone son nvidia K40) no consigo hacer mas de 70000 verificaciones por segundo, menos que lo que sale en las K20 que tenemos locales. No se si sera porque las tengan a bajo consumo o por algun problema ajutando bloques y warps.

    EDIT: en efecto, la p2.xlarge de amazon, $0.972 por hora, mitad de una K80 o algo asi, arranca con velocidad de reloj autoajustable, con lo que para las benchmark hay que subirla a mano. Con eso y un codigo que tenga cuidado de mantener todo en registros, llego a sacar 150mil verificaciones por segundo. Hay que tener en cuenta que cada verificacion son 1715*3 vueltas del sha-transform.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.