Mini-aplicación generadora del DNI electrónico

Gracias al meneo fallido de la anotación sobre los dígitos de control del DNI a cargo de un lector, me entero de que, en 2005, un tal Josep Portella Florit abordó el problema sin conocer el texto que os enlacé donde lo explica todo, y probando, probando, logró llegar al algoritmo utilizado en dichos documentos.

También encuentro que el mismo autor realizó un pequeño programa en JavaScript para el cálculo de los dígitos de control tras introducir los datos pertinentes en un formulario. Para vuestro entretenimiento, he cogido su código y lo he modificado para adaptarlo al nuevo DNI electrónico. Aquí está:

IDESP <<<<<<
? ??? <<<<<<<<<<<

Calcular los dígitos de control del DNI

Muchas leyendas urbanas circulan por ahí acerca del significado de los misteriosos números que lleva el DNI en su reverso; en especial, trae de cabeza a mucha gente el dígito aislado situado a la derecha. Sin embargo, de misterioso no tiene nada. Si acudimos a la página oficial del nuevo DNI electrónico, deja bien claro que el campo situado en la parte trasera es información impresa OCR-B destinada a la lectura mecanizada, y está regulado por la normativa recogida en el documento 9303 de la ICAO. Y como toda información destinada a ser leída por una máquina, se incluyen ciertos dígitos de control detrás de cada uno de los campos para realizar la comprobación de que la lectura ha sido satisfactoria.

Hace cosa de un año, recuerdo que un profesor de criptografía de la universidad nos explicó el sistema que usaban para calcular estos dígitos de control. Olvidé el procedimiento y el documento 9303 donde lo explican, así como el estándar ISO 7501 en el que se convirtió, es de pago. Sin embargo, el otro día di por casualidad con una página donde recogen dicho documento 9303 llamado Machine Readable Travel Documents, Part 1 Volume 1 [PDF], que ha servido para refrescarme la memoria. Así que, aprovechando la circunstancia, paso a detallaros el cálculo de los dígitos de control.

La letra del DNI

Para empezar, explicaré cómo se extrae la letra del DNI, porque también esta letra sirve de control para comprobar que el número es correcto. Esto es más conocido y supongo que a muchos de vosotros al menos os sonará.

Básicamente se divide el número entre 23 y el resto se sustituye por una letra que se determina por inspección mediante la siguiente tabla:

RESTO 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
LETRA T R W A G M Y F P D X B N J Z S Q V H L C K E

Por ejemplo, si el número del DNI es 12345678, dividido entre 23 da de resto 14, luego la letra sería la Z: 12345678Z.

Los dígitos de control

En el DNI electrónico, el reverso tiene esta forma:

IDESPXYZ123456a12345678Z<<<<<<
990101bM111231cESP<<<<<<<<<<<d
URRUTIA<URRUTIA<<ANTXON<<<<<<<

Identifiquemos cada uno de los campos:

  1. {ID}Tipo de documento.
  2. {ESP}Nación.
  3. {XYZ123456}Número de serie del soporte.
  4. {a} Primer dígito de control, correspondiente al campo 3.
  5. {12345678Z}DNI.
  6. {<<<<<<}Relleno.
  7. {990101}Fecha de nacimiento, con el formato año/mes/día.
  8. {b} Segundo dígito de control, correspondiente al campo 7.
  9. {M}Sexo; Masculino o Femenino.
  10. {111231}Fecha de vencimiento, con el formato año/mes/día.
  11. {c} Tercer dígito de control, correspondiente al campo 10.
  12. {ESP}Nacionalidad.
  13. {<<<<<<<<<<<}Relleno.
  14. {d} Cuarto dígito de control, correspondiente a la concatenación de los campos 3, 4, 5, 7, 8, 10 y 11.
  15. {URRUTIA}Primer apellido.
  16. {<}Limitador entre apellidos.
  17. {URRUTIA}Segundo apellido.
  18. {<<}Limitador entre apellidos y nombre.
  19. {ANTXON}Nombre.
  20. {<<<<<<<}Relleno.

Para calcular el dígito de control {a}, se aplica el peso 731 (léase siete tres uno) al campo 3. Si alguno de los carácteres es una letra, se sustituye por su número correspondiente según la siguiente tabla:

A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35

En nuestro caso, X=33, Y=34, Z=35. Decíamos que hay que aplicar el peso 731 de la siguiente manera:

   33    34   35   1   2   3    4    5   6
x   7     3    1   7   3   1    7    3   1
------------------------------------------
        231 + 102 + 35 + 7 + 6 + 3 + 28 + 15 + 6 = 433

Como veis, a cada número se le asigna el peso correspondiente y se multiplica. Después se suman todos los resultados y el dígito de control es la última cifra del total. En este caso, a=3. Para el dígito de control {b}, se repite la operación con el campo 7:

    9    9   0   1   0   1
x   7    3   1   7   3   1
--------------------------
        63 + 27 + 0 + 7 + 0 + 1 = 98

Y obtenemos que b=8. Lo mismo para el dígito {c} con el campo 10:

    1   1   1    2   3   1
x   7   3   1    7   3   1
--------------------------
         7 + 3 + 1 + 14 + 9 + 1 = 35

Obteniendo que c=5. Para terminar, el dígito de control {d} se halla de la misma manera con la concatenación indicada arriba: {3,4,5,7,8,10,11}. Recordad que hay que sustituir las letras por números según la segunda tabla.

   33  34 35 1 2 3  4  5 6  3 1 2  3  4 5  6
x   7   3  1 7 3 1  7  3 1  7 3 1  7  3 1  7
--------------------------------------------
   231+102+35+7+6+3+28+15+6+21+3+2+21+12+5+42+
    7 8  35  9 9 0 1 0 1  8 1 1 1 2  3 1 5
x   3 1   7  3 1 7 3 1 7  3 1 7 3 1  7 3 1
-------------------------------------------
        +21+8+245+27+9+0+3+0+7+24+1+7+3+2+21+3+5 = 925

Por lo tanto, d=5, y el DNI quedaría finalmente así:

IDESPXYZ123456312345678Z<<<<<<
9901018M1112315ESP<<<<<<<<<<<5
URRUTIA<URRUTIA<<ANTXON<<<<<<<

Como apunte final, los que todavía no tengáis el DNI electrónico habréis visto cómo en vuestros DNI antiguos hay un par de cambios: no existe número de serie y el número de DNI va seguido de un dígito de control que se calcula con dicho campo. Lo demás es igual.

Cómo insertar un vídeo de Youtube comenzando la reproducción en un punto concreto

Hace unas semanas publicaban los Microsiervos una forma de enlazar un vídeo de Youtube para que comenzase la reproducción en el punto que nosotros deseáramos. Una interesante característica que desconocía.

También es posible que el siguiente truco sea ampliamente conocido, pero para el que, como yo, se entere hoy, allá va: cómo realizar lo anterior en un vídeo insertado en nuestra página, como hago con la anotación anterior a esta, si os fijáis.

Las URL para insertar un vídeo de Youtube típicamente, sin opciones, tienen esta pinta:

[code]http://www.youtube.com/v/xxxxxxxxxxx[/code]

Donde las equis son una serie de carácteres alfanuméricos que identifican el vídeo en cuestión. Para que el susodicho empiece en el minuto 1:50, por ejemplo, basta con añadir lo siguiente:

[code]http://www.youtube.com/v/xxxxxxxxxxx&amp;amp;start=110[/code]

Donde 110, como podéis imaginar, es el tiempo en segundos. Así de fácil.

Desinstalar extensión Microsoft .NET para Firefox

Me entero a través de The Inquirer ES de que una de las últimas actualizaciones críticas de Microsoft instala una extensión de Firefox de forma oculta (si este está instalado) y desactiva el botón Desinstalar que llevan todas las extensiones. Si recientemente se ha descargado en vuestro sistema la versión 3.5 de la plataforma Microsoft .NET Framework, comprobad los complementos de vuestro Firefox, porque allí estará.

Al parecer, esta nueva jugarreta de los de Redmond se conoce desde finales de febrero, pero dicha actualización en nuestro idioma llegó hace poco (a mí se me instaló hace una semana). Lo peor de todo —dejando a un lado que se hace sin nuestro consentimiento y que, para más inri, nos impiden la desinstalación— es que (según Annoyances.org) dicha extensión «añade a Firefox una de las más peligrosas vulnerabilidades presentes en todas las versiones de Internet Explorer: la capacidad de que cualquier sitio web instale software en nuestro PC de forma encubierta con total facilidad».

De la misma página, os traigo las instrucciones para eliminar esto de vuestros inmaculados navegadores:

  1. Abrir el Editor del Registro de Windows (teclear regedit en la caja Buscar del menú Inicio en Vista/Windows 7, o en la ventana Ejecutar de XP).
  2. Navegar hasta la siguiente rama del registro:
    • En sistemas de 32 bits: HKEY_LOCAL_MACHINE \ SOFTWARE \ Mozilla \ Firefox \ Extensions
    • En sistemas de 64 bits: HKEY_LOCAL_MACHINE \ SOFTWARE \ Wow6432Node \ Mozilla \ Firefox \ Extensions
  3. Borrar el valor llamado {20a82645-c095-46ed-80e3-08825760534b} del panel del registro.
  4. Cerrar el Editor.
  5. Abrir una nueva ventana de Firefox, y en la barra de dirección, escribir about:config y presionar Enter.
  6. Escribir microsoftdotnet en el campo Filtro para buscar rápidamente la opción general.useragent.extra.microsoftdotnet.
  7. Click derecho en general.useragent.extra.microsoftdotnet y seleccionar Restablecer.
  8. Reiniciar Firefox.
  9. Abrir el Explorador de Windows, y navegar hasta la carpeta %SYSTEMDRIVE%\Windows\Microsoft.NET\Framework\v3.5\Windows Presentation Foundation.
  10. Borrar la carpeta DotNetAssistantExtension.
  11. Abrir los Complementos de Firefox para confirmar que la extensión Microsoft .NET Framework Assistant ha sido eliminada.

Bombas fork

La bomba fork es un ataque de tipo DoS para sistemas operativos. Se llama así por la función fork() de UNIX, encargada de crear procesos hijos y base de este ataque. Mediante unas pocas líneas de código ejecutadas por cualquier usuario de manera local, se puede tumbar cualquier máquina en cuestión de segundos. No es algo que se pueda parchear fácilmente debido a que no es ningún fallo ni ninguna vulnerabilidad. Tampoco se puede identificar como virus o malware, porque tampoco lo es. Una bomba fork suele hacer uso de algo tan sencillo como un bucle infinito dentro del cual se crea un proceso hijo. Así, el número de procesos en el sistema crece de forma incontrolada hasta consumir los recursos de la máquina (memoria RAM y procesador), quedando colgada. ¿El resultado? Pues que hay que reiniciar a las bravas (léase tirando del cable o pulsando el botón), pero nada más. No supone ningún peligro, salvo que estemos trabajando con algún documento y no hayamos guardado…

En resumidas cuentas, la bomba fork no es un agujero en la seguridad de los sistemas operativos porque no produce ningún daño (salvo la molestia), porque lo tiene que ejecutar el propio usuario del sistema (luego es un suicidio en toda regla) y porque es más bien una característica de los lenguajes de programación y el resultado de un programador patoso. Vamos, que es lo mismo que tirar del cable de alimentación queriendo. Aun así, no deja de ser una bonita curiosidad.

Vamos a ver unos ejemplos. Empecemos con Linux. Existe una bomba fork para este sistema que tiene el honor de ser considerada «la bomba más bonita jamás creada», tanto por su simplicidad como por su elegancia. El código es el siguiente:

[code lang=»bash»]:() { : | : & };:[/code]

Así de simple. Si introducimos lo anterior en una consola de Linux, probablemente el ordenador quedará inmediatamente colgado. O no. Este código se conoce desde hace bastante tiempo y es posible que en vuestra distribución de Linux ya no funcione porque hayan implementado algún tipo de protección contra usuarios suicidas. Por ejemplo, en mi Fedora 10 no funciona. Si lo analizamos, es lo mismo que escribir lo siguiente:

[code lang=»bash»]funcion() {
funcion | funcion &
};
funcion[/code]

forkbombAhora está mucho más claro: definimos una función y luego la llamamos. Dentro de la misma, se llama a sí misma y el resultado se pasa por una tubería a ella misma de nuevo y todo estos se ejecuta en segundo plano (carácter «&»). Es decir, de cada proceso salen dos nuevos, y de cada uno de ellos, otros dos, y así hasta que el sistema operativo lo permita.

Windows también tiene su versión de línea de comandos, y tiene esta pinta:

[code lang=»plain»]:s
start %0
%0 | %0
goto s[/code]

Hace lo mismo que la anterior. Basta con guardar esto en un fichero de texto y cambiarle la extensión de «.txt» a «.bat». Tras esto, ejecutar y disfrutar del espectáculo. Guardad todo lo que estéis haciendo primero, que esta sí que funciona, aunque no deja el sistema totalmente colgado, porque llega un momento que los procesos creados empiezan a dar errores de aplicación y la carga del sistema baja, con lo que se puede llegar a hacer algo, pero de todas formas hay que acabar reiniciando.

Y ahora vienen las bombas buenas. Las que dejan al sistema congelado sí o sí, tanto para Linux como para Windows, en lenguaje C. La primera la del pingüino:

[code lang=»c»]#include <unistd.h>

int main(void) {
while(1)
fork();
return 0;
}[/code]

Copiad este código en un archivo y guardadlo como «.c». Tras esto, compiladlo con nuestro querido gcc —sí, de acuerdo, es una mierda, pero es nuestra mierda— y lanzad el binario. It works!

Bien, y como lo prometido es deuda, la versión de Windows (esta es cosecha propia, seguro que las hay mejores):

[code lang=»c»]#include <windows.h>

int main (void) {
STARTUPINFO si;
PROCESS_INFORMATION pi;

ZeroMemory( &si, sizeof(si) );
si.cb = sizeof(si);
ZeroMemory( π, sizeof(pi) );

while(1)
CreateProcess ("bomba.exe", NULL, NULL, NULL, TRUE, 0, NULL, NULL, &si, π);
return 0;
}[/code]

Aquí el archivo se llama «bomba.cpp» y al compilar queda como «bomba.exe», por lo que la llamada anterior hace que se inicie a sí mismo. Para los que lo queráis probar, podéis descargar el ejecutable desde aquí.

Como ya hemos comentado, no es algo grave para ningún sistema operativo y un ordenador personal, pero sí que hay que tenerlo en cuenta cuando se trata de servidores. Los administradores deben tener cuidado y configurar adecuadamente los equipos para evitar que usuarios tocahuevos con acceso shell puedan darles un disgusto. Así pues, la solución que pueden aplicar es limitar el número de procesos que puede crear un usuario. Con 20 son más que suficientes. En Linux, mediante el comando ulimit -a podemos ver el número de procesos máximo de nuestro usuario. En mi distribución, el límite está en 1024, algo alto. Esto se puede modificar en el archivo /etc/security/limits.conf.

Para más información y para ver bombas en otros lenguajes de programación, visitad la página de la Wikipedia (primer enlace).