¿Qué es una función hash?

Ayer comentaba en Facebook que una cadena alfanumérica que aparecía en una noticia “parecía el resultado de alguna función hash” y hubo gente que me preguntó qué era eso de una función hash. Así que he pensado que lo mejor será contarlo por aquí que me puedo extender más.

Cifrado

Las funciones hash, también llamadas “digest” o “de resumen“, son algoritmos que calculan y devuelven una cadena de texto alfanumérica de longitud fija calculada a partir de un dato de entrada, que puede ser un texto o un fichero binario. Se trata de funciones unidireccionales, lo que quiere decir que aun teniendo el resultado y conociendo el algoritmo no debe ser posible revertir las operaciones para descifrar el dato de entrada.

Son también funciones determinísticas, siempre devuelven la misma salida para la misma entrada. Al ser resúmenes existe la posibilidad de que dos entradas totalmente distintas devuelvan el mismo resultado, es lo que se llama una “colisión“. Teóricamente es imposible crear una función hash sin colisiones, puesto que las posibilidades de entrada son infinitas pero las de salida están limitadas a la longitud de la cadena de resumen, por tanto a mayor logitud de respuesta menor posibilidad de colisión y mayor robustez para el algoritmo. Las colisiones son lo que facilita un tipo de ataque criptográfico llamado “Ataque de Cumpleaños” del que puedes leer en ese enlace.

Por ejemplo, si calculo el hash de la cadena “hola” con el algoritmo md5 el resultado será: 4d186321c1a7f0f354b297e8914ab240. En cambio si le paso la cadena “Hola“, con mayúscula, el resultado devuelto será: f688ae26e9cfa3ba6235477831d5122e.

¿Qué utilidad tiene esto? Bueno, no se trata de un algoritmo para cifrar un mensaje y poder descifrarlo luego, como pueda ser el caso de AES, no tiene el mismo propósito que la criptografía simétrica o asimétrica. Las funciones hash son útiles por ejemplo para almacenar contraseñas en una base de datos, ya que aunque alguien lograra acceder a ellas no podría descifrar cual es la contraseña original. Otro de sus principales usos es asegurar que un fichero no ha sido modificado durante el trayecto desde su envío: se calcula el hash antes de enviarlo, si al recibirlo lo volvemos a calcular y el resultado no es el mismo implica que alguien ha capturado (un ataque de intermediario o man in the middle) y modificado el fichero. Las funciones hash también se utilizan en los procesos de firma digital de documentos.

¿Cuales son los algoritmos de resumen más populares o más comunes? Te dejo una lista con sus enlaces a Wikipedia:

Anuncios

Cómo saber qué programa está usando o bloqueando un puerto con netstat en Windows

Me pasó ayer que no me arrancaba una aplicación web en un servidor Windows que no gestiona en su totalidad mi empresa. Intentabas arrancar pero había algo ocupando el puerto 80. ¿Cómo podía encontrar qué programa estaba ocupando ese puerto? Pues sirviéndome de netstat.

El comando a ejecutar sería el siguiente

netstat -ano -p tcp

De esta forma podemos ver todos los puertos, incluyendo los que están en escucha (parámetro -a), se muestran los puertos de forma numérica (parámetro -n) y el número de proceso (parámetro -o), filtrando por protocolo (parámetro -p) para mostrar solo los de TCP. Pero claro, esto nos saldría una salida enorme porque mostraría todos los puertos TCP y nosotros solo queremos el puerto 80. Podemos filtrar más:

netstat -ano -p tcp | find ":80"

Añadiendo una tubería para el filtrado podemos usar el comando find para que muestre solo los que tengan una referencia al puerto 80, quitándonos mucha información de encima.

Finalmente, si hemos localizado el proceso y queremos matarlo podemos abrir el Administrador de Tareas o simplemente usar el comando taskkill para eliminarlo usando el PID, por ejemplo si el PID fuera el 881 sería así:

taskkill /PID 881

Powershell: arrancar o parar el servidor web IIS.

¿Cómo arrancamos, paramos o reiniciamos el servidor web IIS desde comandos con Powershell?

Reiniciar: IISReset /RESTART
Parar: IISReset /STOP
Arrancar: IISReset /START

Esto para y arranca todo el servidor web. ¿Y si queremos arrancar o parar un sitio web concreto? Tenemos dos comandos que lo hacen por el nombre de sitio, que varían según la versión de nuestro sistema operativo:

Arrancar (Windows 8 o Windows server 2012): Start-WebSite -Name “Nombre de Nuestra Web”
Arrancar (Windows 10 o Windows server 2016): Start-IISSite -Name “Nombre de Nuestra Web”

Parar (Windows 8 o Windows server 2012): Stop-WebSite -Name “Nombre de Nuestra Web”
Parar (Windows 10 o Windows server 2016): Stop-IISSite -Name “Nombre de Nuestra Web”

Esta es la sintaxis básica, pero tanto Start-WebSite como Stop-WebSite tienen una serie de parámetros extra que puedes revisar en la web de Microsoft en los enlaces anteriores.

¿Qué hacer si alguien distribuye imágenes íntimas nuestras en internet?

No es una entrada técnica, pero por lo que he visto hoy puede ser muy práctica.

Si algún desaprensivo tiene fotos o vídeos vuestros en una situación sexual y los hace públicos, a través de una red social, un sistema de mensajería, un foro o alguna web de vídeos es importante mantener la calma en el primer momento. Ok, tendrás ganas de matar a alguien y el impulso de insultar o amenazar, pero no es lo más práctico. Distribuir esas imágenes es un delito en España y en la mayoría de países de la Unión Europea.

  • Lo primero es recopilar pruebas: recoger los enlaces, descargar todo lo descargable y hacer capturas de pantalla, aunque teniendo en cuenta que no son una prueba definitiva. Es importante preservar estas pruebas ante notario o en el juzgado.
  • Lo siguiente es hacer una denuncia ante las fuerzas de seguridad pertinentes.
  • Con la denuncia presentada y las pruebas recopiladas y registradas es el momento de contactar con el servicio donde se ha publicado para que corten la difusión del mismo. Si hay una denuncia de por medio seguramente se muestren colaborativos rápidamente.

¿Por qué en este orden? Porque si en un primer momento amenazas, o insultas, le das la opción al delincuente de borrar su rastro. Es posible que esto detenga la difusión, cierto, pero también entorpece la investigación y puede que se vaya de rositas para volver a repetir su delito.

Entiendo que cuesta mantener la sangre fría en un momento de tal gravedad, pero es importante proceder bien para conseguir que el responsable acabe recibiendo una condena en el juzgado.

Comprobar la velocidad de conexión desde línea de comandos en Linux.

Hay múltiples webs que nos permiten ejecutar tests de velocidad, pero a veces estamos administrando un servidor sin entorno gráfico y resulta útil poder lanzar un comando que nos de el resultado. Con la siguiente línea puedes hacerlo sin tener que instalar nada:

curl -s https://raw.githubusercontent.com/sivel/speedtest-cli/master/speedtest.py | python -

Os dejo una captura del resultado desde casa de mis padres.

Teste de velocidad comandos

Calcular la mediana en SQL-Server

Como no me apetece meterme en una discusión infructuosa con un individuo *troll ultraderechista sexualmente frustrado* voy a aprovechar la hora de comer en el trabajo para comentaros cómo podemos calcular la mediana de una serie de números en SQL-Server. Ya vimos no hace mucho el significado de este término y también cómo podemos calcularlo en Libre Office Calc.

Si vamos a trabajar con SQL-Server 2012 o superior la función PERCENTILE_DISC() nos servirá, sin tener que hacer nada más. Es una función que calcula un percentil concreto para una serie de valores ordenados de un conjunto de filas, y su sintaxis es:

PERCENTILE_DISC ( número ) WITHIN GROUP ( ORDER BY exp_ordenación [ ASC | DESC ] )
OVER ( [ partido_por ] )

Aquí os copio sus argumentos de la web de documentación de Microsoft directamente, donde también tenéis ejemplos de código para SQL-Server y para Azure:

  • número :El percentil que se va a calcular. El valor debe estar entre 0,0 y 1,0.
  • WITHIN GROUP ( ORDER BY exp_ordenación[ ASC | DESC ]):Especifica una lista de valores para ordenar y cuyo percentil se va a calcular. Solo se permite una exp_ordenación. El criterio de ordenación predeterminado es ascendente. La lista de valores puede ser de cualquiera de los tipos de datos válidos para la operación de ordenación.
  • OVER ( partido_por ):Divide el conjunto de resultados generado por la cláusula FROM en particiones a las que se aplica la función de percentil. Para más información, vea Cláusula OVER (Transact-SQL). Las cláusulas y no se pueden especificar en una función PERCENTILE_DISC.

De esta forma PERCENTILE_DISC(0.5) calculará la mediana del cojunto de filas que estamos analizando.

Pero ¿qué pasa si trabajamos con una versión anterior a SQL-Server 2012? Te parecerá algo prehistórico, pero en muchos sitios sigue funcionando SQL-Server 2008 o 2005. ¿Cómo lo hago ahí donde no dispongo de la función PERCENTILE_DISC()?

Bueno, ahí he hecho una solución un poco picapedrera, porque según el conjunto de datos que tengamos las hay bastante mejores. Esta realmente consume muchos recursos, pero por otra parte es universal. Si la tabla cuenta con una columna de Identidad la cosa puede ser más eficiente:

Básicamente he usado una tabla llamada Actividades, donde hay una columna numérica llamada Importe. Para calcular la mediana de este importe vamos a sacar los dos valores centrales dividiendo las filas en dos mitades, ordenando una de forma descendente y otra ascendente. Tras eso los sumamos y hacemos la media de la suma.

Select ((
    Select Top 1 Importe
    From   (
                    Select  Top 50 Percent Importe
                    From    Actividades
                    Where   Importe Is NOT NULL
                    Order By Importe
                    ) As A
    Order By Importe DESC) + 
    (
    Select Top 1 Importe
    From   (
                    Select  Top 50 Percent Importe
                    From    Actividades
                    Where   Importe Is NOT NULL
                    Order By Importe DESC
                    ) As A
    Order By Importe Asc)) / 2 as MedianaImportes

Configurar las combinaciones de teclas en Virtual Box

Si estás usando Virtual Box y no has tocado las combinaciones de teclas de la máquina seguramente te hayas frustrado al intentar hacer la combinación de teclas Ctrl+Alt+Supr, o al pulsar Ctrl+C para copiar un fichero y ver que de repente te cambia el tamaño de la pantalla. El visor de Virtual Box tiene una serie de comandos propios y la tecla anfitrión por defecto es Ctrl Derecha, pero esto puede configurarse:

En la parte superior te vas a Archivo->Preferencias, desde donde te abrirá una nueva ventana. En la columna izquierda de dicha ventana pulsas Entrada y en el menú que te abrirá vas a la pestaña Máquina Virtual. Aquí tienes una captura de la ventana.

Configuración VirtualBox

Ahí puedes modificar la tecla anfitrión por defecto y poner una que uses menos, además de poder definir las combinaciones como más nos plazca o habilitar algunas que no vienen por defecto.