Inteligencia artificial: “hic sunt dracones”

Hic sunt dracones

En las cartas náuticas de la antigüedad, más allá de las tierras conocidas, se dibujaban seres monstruosos e imposibles acompañados de la leyenda Hic sunt dracones (aquí hay monstruos) indicando a los navegantes que a partir de ese meridiano era tierra ignota, que toda navegación más allá era, a la vez, pionera y bajo su responsabilidad.

Hablando de computación llamamos Inteligencia Artificial  a un conjunto de técnicas capaces de hacer “aprender” a un programa acerca de determinadas cosas. En esta determinación podemos incluir tareas tan variadas como el análisis de imágenes para diagnóstico médico, análisis de los correos electrónicos para filtro de spam, finanzas, procesos de optimización del tráfico rodado, y un larguísimo etcétera que sale del propósito de este artículo.

Continuar leyendo “Inteligencia artificial: “hic sunt dracones””

El algoritmo de encriptación md5 y los diccionarios de hackers

Funcionamiento

El algoritmo de encriptación md5 es, en teoría, de un solo sentido. Quiero decir que a una entrada determinada le corresponde un y sólo un hash (picadillo) o código resultante del algorirmo y no es posible, en teoría, averiguar qué código información es la que ha producido tal salida.

Es un poco como las máquinas de bolas de los chiquillos, cuando introduces tu moneda, te corresponde una bola en la que no sabes lo que hay dentro, pero si quisieras devolver la bola y obtener el dinero es imposible saber cuál es la moneda del cajetín de monedas que produjo tu bola, pues son todas iguales.

Continuar leyendo “El algoritmo de encriptación md5 y los diccionarios de hackers”

Funciones para calcular cif, dni y nie en España

Existen funciones que aunque no son gran cosa, conviene tener siempre a mano, pues es casi seguro que las vamos a usar en casi todas las gestiones empresariales que desarrollemos. Me refiero, entre otras, al cálculo del DNI, que es muy común, al NIE, que casi siempre me lo encuentro mal programado; y el más raro de encontrar el cálculo del CIF (código de identificación fiscal para sociedades en España). Continuar leyendo “Funciones para calcular cif, dni y nie en España”

Hooks en CodeIgniter para llamar al lenguaje instalado en el navegador

CodeIgniter, tiene la posibilidad de habilitar hooks. En otras palabras: podemos indicarle al framework el lugar donde queremos interrumpir la secuencia flujo de la aplicación, insertar nuestro código, y continuar.

Según el manual de Codeigniter, podemos insertar una interrupción en los siguientes puntos.

Continuar leyendo “Hooks en CodeIgniter para llamar al lenguaje instalado en el navegador”

Crear una buena instalación limpia de CodeIgniter

procesos

Descargar las fuentes

Crear una buena instalación vacía de CodeIgniter es simple, aunque hay muchísimas cosas que configurar para disponer del framework operativo.

Existen muchísimos sitios donde descargar CodeIgniter, a mí me gusta hacerlo desde este enlace de Github, que corresponde a British Columbia Institute of Technology, universidad que se hizo cargo del proyecto tras el abandono del mantenimiento por parte de Ellislab, quien lo desarrolló originalmente.

Continuar leyendo “Crear una buena instalación limpia de CodeIgniter”

Cómo evitar los ataques web más comunes

@pedroruizhidalg― Los ataques a web más comunes son fácilmente evitables mediante la adopción de ciertas técnicas sencillas y sistemáticas. Estos ataques, generalmente, entran vía formularios, donde paradójicamente es la misma web quien solicita datos y deja pasar el malware.

Valida siempre en cliente-servidor

Los formularios validados en JavaScript son espectaculares en cuanto a su usabilidad. No cabe duda, ya que en tiempo real nos muestra el error con una amplia variedad de acciones por parte del programa: cambiando de color el campo, indicándolo en una zona destinada a tal efecto, etcétera. Si embargo el código JavaScript se ejecuta en el cliente, con lo que confiar exclusivamente en la validación JavaScript es como pensar que todo el mundo es bueno y confiar que nadie te va a incluir ningún dato inválido.

La validación definitiva (doble validación si se prefiere) debe ser siempre ejecutada en el lado servidor, ya que en el servidor es mucho más compicado la admisión de datos inválidos.

El ataque XSS

Este ataque se caracteriza por la “inyección” de código ejecutable entre los datos de formulario web. Supongamos que en un formulario, en un campo apellidos se teclea en lugar de apellidos el siguiente código:

javascript:while(1)alert("Esta web no tiene seguridad XSS");

Cada vez que la web muestre “apellidos” aparecerá un mensaje emergente con el texto de nuestra elección. No profundizo más en este asunto por razones fácilmente comprensibles. Pero añadiré que no es difícil inyectar código en las web que no implementan seguridad XSS entre sus medidas.

El ataque CSRF

Una buena parte de la programación de una web está dedicada a crear un buen procedimiento de captura de datos. Para ello se crea un estructura que analiza y discrimina los formularios tal y como los espera encontrar nuestro programa. Sin embargo nada nos garantiza que el formulario que los emite resida en un ordenador externo a nuestro servidor.

En otras palabras, el atacante replica nuestro formulario y nos inunda de datos que previamente no han pasado por nuestro “circuito” y procedimientos. Aún con un filtro XSS, si no cuidamos esta vulnerabilidad es posible (a la vez que muy fácil) crear un formulario que envíe datos aleatorios al sitio atacado.
#aboutpedroruizhidalgo

[polldaddy poll=9120832]
♻ miotroblogsite ahorra papel

Script con funciones bash y encf con password automático

Extracto:

Usualmente manejo tres carpetas que encripto con encfs, a las que llamaré para este arículo ‘aikido’, ‘judo’ y ‘karate’, cada una de ellas con su propio password. En este script podemos ver cómo mediante una función en bash puede automatizarse este proceso. Es importante compilar luego con el comando shc para ofuscar el código fuente, es decir, las palabras de paso.

@pedroruizhidalg― Trabajo solo. Esto, con sus inconvenientes, también tiene la ventaja de permitirme ciertas licencias en cuanto a la seguridad dentro de mi propio equipo. Tengo mi ordenador preparado para ejecutar scripts propios, y también ejecuto el comando shc para poder “compilar” (sí, entre comillas) mis códigos bash, de forma que el código fuente fuente quede ofuscado. Por lo que automatizar un script que posea passwords no me supone más problema que impedir el acceso de extraños a mi equipo.

Descripción

Mediante este script puedo montar los volúmenes sin necesidad de añadir más código, ni passwords.

#!/bin/bash

:<<COMMENT

 Subject: this script allows to mount few directories with encfs.
 Author: Pedro Ruiz Hidalgo
 Date: 2017-15-03

COMMENT

# COLORES

tab="\t"
RED='\033[0;31m'
BOLD='\033[1m'
NC='\033[0m'

# FUNCION MONTAJE

function montaje()
{
 local dircripto=$1
 local dirclaro=$2
 local passwd=$3

 echo $passwd | encfs -S $dircripto $dirclaro
}

# PROCESO
echo -e "Selecciona opción "
echo -e "${BOLD}1$NC) Judo"
echo -e "${BOLD}2$NC) Aikido"
echo -e "${BOLD}3$NC) Karate"
read -p "Introduce tu opción: " -n 1 -r

case $REPLY in
 1)
 echo -e "\nEstás montando ${BOLD}Judo$NC"
 montaje '/home/pedro/judo' '/home/pedro/judo_' 'passworddejudo'

 exit $?
 ;;
 2)
 echo -e "\nEstás montando ${BOLD}aikido$NC"
 montaje '/home/pedro/aikido' '/home/pedro/aikido_' 'passworddeaikido'
 exit $?
 ;;
 3)
 echo -e "\nEstás montando ${BOLD}Karate$NC"
 montaje '/home/pedro/Documentos/karate' '/home/pedro/Documentos/karate_' 'passworddekarate'
 exit $?
esac

Ejecución

La primera linea es la llamada “shebang” que permite comunicar al sistema qué intérprete debe ejecutar el presente script. Luego viene un comentario multilínea de bash para identificar el archivo fuente. En la sección COLORES se describen los colores a usar en el script. En FUNCIÓN MONTAJE, se describen tres variables locales, la primera de ellas la incluiré en la variable dircripto: el directorio que contiene los archivos encriptados. La segunda de las variables la moveré a dirclaro: el directorio que me permite ver los archivos desencriptados. La tercera es para el password. Cuando tengo las tres variables uso la función echo con la variable password y una tubería hacia el comando encfs con el argumento -S, que permite recibir el password desde fuera del propio comando encfs.

Tras eso, no es más que mostrar por pantalla unas opciones y evaluarlas en un case-esac, dependiendo del número que haya elegido se montará una u otra carpetas.

Es fácil crear otro script para que desmonte los directorios mediante:

$ fusermount -u $dirclaro

 

Epílogo

Espero y deseo que este artículo haya sido de utilidad. Es muy importante para la continuación de trabajos de calidad recibir algún tipo de feedback por parte de los lectores: es decir, responde con comentarios, evalúa la calidad del trabajo con el sistema de estrellas, comparte con tus redes sociales, da me gusta, marca el blog como favorito. Son pequeños gestos que ayudan a mantener el trabajo de creación.

 #aboutpedroruizhidalgo
[polldaddy poll=9120832]
♻ miotroblogsite ahorra papel

Aprende a usar el comando shc para compilar scripts

shell bash

Extracto:

El comando shc permite ofuscar los scripts escritos en bash, lo que elimina uno de los grandes inconvenientes a  la hora de difundir nuestros scripts en modo texto: todo el mundo que tenga acceso al script tiene acceso a su código fuente. Shc es fácil de manejar y bastante intuitivo.

@pedroruizhidalg― Cuando creamos un script en bash, uno de sus pricipales inconvenientes es el acceso al código fuente en texto plano.

Descripción

$ shc --help
shc: invalid option -- '-'
shc parse: Unknown option
shc Version 3.8.9b, Generic Script Compiler
shc Copyright (c) 1994-2015 Francisco Rosales <frosal@fi.upm.es>
shc Usage: shc [-e date] [-m addr] [-i iopt] [-x cmnd] [-l lopt] [-rvDTCAh] -f script

    -e %s  Expiration date in dd/mm/yyyy format [none]
    -m %s  Message to display upon expiration ["Please contact your provider"]
    -f %s  File name of the script to compile
    -i %s  Inline option for the shell interpreter i.e: -e
    -x %s  eXec command, as a printf format i.e: exec('%s',@ARGV);
    -l %s  Last shell option i.e: --
    -r     Relax security. Make a redistributable binary
    -v     Verbose compilation
    -D     Switch ON debug exec calls [OFF]
    -T     Allow binary to be traceable [no]
    -C     Display license and exit
    -A     Display abstract and exit
    -h     Display help and exit

    Environment variables used:
    Name    Default  Usage
    CC      cc       C compiler command
    CFLAGS     C compiler flags

    Please consult the shc(1) man page.

$

Para muestra, un botón. Este es, así de simple, el help del comando shc con lo que podemos insertar fecha de caducidad al script, esto es especialmente útil cuando tengas que distribuir en tu equipo (hablo de personas) de trabajo un script que por sus características tengan fecha de caducidad, por cualquier causa. Mensaje cuando el archivo esté caducado. Así como otras opciones interesantes que os dejo descubrir a vosotros.

Es interesante saber que está en los repositorios Ubuntu. En la práctica significa que podemos descargarlo así:

$ sudo apt update
$ sudo apt install shc

Y con esto ya lo tenemos listo para ejecutar.

Ejecución

El comando shc generará dos archivos, uno con la extensión .x, que será el ejecutable, y otro .x.c que contendrá el código en c. Con el argumento -f indicamos el nombre del archivo shell a compilar. Me encontré un problema con la línea shebang porque según mi costumbre la escribo llamando a env, para que el suministre la dirección de bash. Lo hago así.

#!/usr/bin/env bash

Sin embargo para compilar hay que cambiarlo a:

#!/bin/bash

La sintaxis es simple, imaginemos que quiero compilar un archivo que se llama “buscar”, sería así.

$ shc -f buscar

Epílogo

Espero y deseo que este artículo haya sido de utilidad. Es muy importante para la continuación de trabajos de calidad recibir algún tipo de feedback por parte de los lectores: es decir, responde con comentarios, evalúa la calidad del trabajo con el sistema de estrellas, comparte con tus redes sociales, da me gusta, marca el blog como favorito. Son pequeños gestos que ayudan a mantener el trabajo de creación.

#aboutpedroruizhidalgo

[polldaddy poll=9120832]
♻ miotroblogsite ahorra papel

Dejar funcionando un proceso aunque cerremos el terminal

procesos
procesos
procesos en Linux

Extracto:

Dejar funcionando un proceso aunque cerremos el terminal. El comando de Linux disown permite perder la propiedad de un proceso para que éste siga ejecutándose en segundo plano, lo que permite cerrar el terminal sin que por ello se pierda (o muera) el proceso.

@pedroruizhidalg― Es muy común que tengamos de dejar un terminal abierto porque en él tenemos un proceso muy largo. También suele coincidir que los procesos largos son “delicados”. Mientras trabajamos en otra cosa, siempre corremos el riesgo de cerrar el terminal accidentalmente: matando irremisiblemente el proceso o procesos que estuvieran activos en ese terminal. Se acabó todo.

Descripción

El comando disown, como decimos arriba, pierde la propiedad del proceso: en otras palabras, desvincula el proceso del la ejecución del terminal. Vamos a simular un comando muy largo con el comando de linux yes. Como sabéis este comando envía al terminal (o a la salida que hayamos definido) el carácter ‘y’ mientras esté activo.

Por tanto nuestra idea va a ser desviar el comando yes a /dev/null y pasar este proceso a segundo plano mediante la orden ‘&’. Comprobaremos que se está ejecutando con el comando jobs. Posteriormente desvincularemos, cerraremos el terminal y dispondremos de ese proceso desde un terminal nuevo.

Ejecución

$ yes > /dev/null &
[1] 10889
$ jobs
[1]+  Ejecutando              yes > /dev/null &

Como ahora tenemos un el proceso yes enviando datos a /dev/null en segundo plano, esto está numerado con nuestro proceso 1. Al que nos referiremos como %1 para identificar el proceso. Ahora vamos a desvincularlo y procesarlo desde otro terminal.

$ disown -h %1
$ jobs

Ahora podemos cerrar el terminal tranquilamente. Abrimos otro y miramos los procesos ‘yes’ que se esté ejecutando así:

$ ps -ef | grep yes
pedro 10889 8917 99 15:00 pts/1 00:07:14 yes

Si queremos cerrarlo definitivamente, en el ejemplo que nos ocupa es conveniente para no tener ahí un proceso ejecutándose hasta que se apague el ordenador. Así:

$ kill -9 10889

Con lo que hemos terminado el ciclo completo.

Epílogo

Espero y deseo que este artículo haya sido de utilidad. Es muy importante para la continuación de trabajos de calidad recibir algún tipo de feedback por parte de los lectores: es decir, responde con comentarios, evalúa la calidad del trabajo con el sistema de estrellas, comparte con tus redes sociales, da me gusta, marca el blog como favorito. Son pequeños gestos que ayudan a mantener el trabajo de creación.

 #aboutpedroruizhidalgo
[polldaddy poll=9120832]
♻ miotroblogsite ahorra papel

Crea scripts propios para encriptar y desencriptar

La Criptografía simétrica es un muro.

Extracto:

Tener la posibilidad de encriptar y desencriptar rápidamente en tu sistema aporta un plus de comodidad que hará ejecutes tus propios comandos más a menudo que si lo haces directamente desde el comando nativo del sistema ―al menos para mí―.

Este artículo consta de dos scripts (muy similares), realizados en BASH, uno para encriptar y otro para desencriptar, a los que añadiremos un parámetro para ayuda que nos proporcione la sintaxis en caso de olvidarla.

@pedroruizhidalg― Antes de continuar leyendo asegúrate que sabes cómo preparar tu sistema para ejecutar nuestros comandos.

Existe la creencia que la CS es menos potente que la CA. Es un mito, quizá debido al desconocimiento. Aclaremos, antes de empezar algunos conceptos: La diferencia entre las CS y CA no es más que la desconfianza en el canal de distribución de las claves. En el caso de la CA, existen dos claves, una pública y otra privada, de tal forma que exponiendo tu clave pública en uno de los muchos servidores existentes. Yo uso Rediris, pero realmente no tiene mucha importancia cuál uses, pues los servidores de clave se intercambian información para expandir lo más posible alrededor del mundo el mayor número de claves posible. El programa GPG encripta conociendo la clave privada del emisor y la clave pública del receptor, encripta de distinta forma para cada uno de los destinatarios, aún cuando el mensaje sea el mismo.

En cambio, la criptografía simétrica, asume que el canal de distribución de las claves es absolutamente seguro. Esta afirmación es cierta cuando estás encriptando para ti mismo ¿En qué situación? Pues porque quieres alejar de miradas indiscretas algo que tienes en tu sistema, ya sea, por ser información comprometida o por alguna otra razón que no entraré a describir.

Abreviaturas usadas

  • CS: Criptografía Simétrica.
  • CA: Criptografía Asimétrica.
  • GPG: GnuPG.

Descripción

Preparemos el primero de los comandos, lo llamaremos “symmetric.c” y se encargará de encriptar. Así:

$ touch symmetric.c
$ chmod +x symmetric.c

Con nuestro editor preferido le añadimos el siguiente código:

#!/usr/bin/env bash
echo "+------------------------+"
echo "| por Pedro Ruiz Hidalgo |"
echo "+------------------------+"
echo " "

if [[ $1 == "-h" ]];
then
 echo " "
 echo "symmetric.c ARCHIVO para comprimir"
 echo "symmetric.c ARCHIVO ARCHIVO para comprimir indicando archivo de salida"
 echo " "
 exit 0
fi

if [ $# -lt 1 ];
then
 echo "Necesitas un parámetro como nombre de archivo a encriptar"
 echo " "
 echo "symmetric.c -h para help"
 echo " "
fi

if [ $# = 1 ];
then
 gpg --symmetric --cipher-algo AES256 $1
 exit 0
fi

if [ $# = 2 ];
then
 gpg -a -o $2.gpg --symmetric --cipher-algo AES256 $1
 exit 0
fi

El primero de los if comprueba que el parámetro sea ‘-h”, en tal caso muestra la ayuda. El segudo if, mira si el número de parámetros que nos han pasado. Si viene sin parámetros lo indicamos y sugerimos que se ejecute la ayuda. El tercero, encripta el nombre de archivo que le pasemos como parámetro y genera ese mismo nombre de archivo con la extensión “.gpg” al final. El cuarto if, nos sirve para proporcionar nosotros mismos el nombre del archivo resultante.

A continuación creamos el archivo “symmetric.d” de forma análoga a su compañero. Igualmente le asignamos permisos de ejecución de tal forma como hicimos con su compañero mediante el comando chmod.

#!/usr/bin/env bash
echo "+------------------------+"
echo "| por Pedro Ruiz Hidalgo |"
echo "+------------------------+"
echo " "

if [ $# -lt 1 ];
then
 echo " "
 echo "symmetric.d -h para help"
 echo " "
 exit 0
fi

if [[ $1 == "-h" ]];
then
 echo " "
 echo "symmetric.d ARCHIVO para desencriptar"
 echo "symmetric.d ARCHIVO ARCHIVO para desencriptar indicando archivo de salida"
 echo " "
 exit 0
fi

if [ $# == 1 ];
then
 gpg -d $1
 exit 0
fi

if [ $# == 2 ];
then
 gpg -o $2 -d $1
 exit 0
fi

El primero de los if comprueba que el número de parámetros sea al menos uno. En caso contrario (no hay ningún parámetro) sugiere que pidan ayuda con el parámetro ‘-h’. El segundo if realiza la comprobación de si están pidiendo ayuda, si es así la muestra. El tercero de ellos desencripta y muestra la salida por pantalla. El cuatro if, desencripta de igual forma pero dando nombre al archivo generado.

Ejecución

Probar el script symmetric.c

$ echo "esto es un contenido cualquiera" > qaz.txt
$ symmetric.c qaz.txt qaz.gpg

Probar el script symmetric.d

$ symmetric.d qaz.gpg qaz2.txt

Epílogo

Atenderé cualquier duda que tengáis acerca de los scripts y su funcionamiento. Los he resumido al máximo para su clara comprensión.

Espero y deseo que este artículo haya sido de utilidad. Es muy importante para la continuación de trabajos de calidad recibir algún tipo de feedback por parte de los lectores: es decir, responde con comentarios, evalúa la calidad del trabajo con el sistema de estrellas, comparte con tus redes sociales, da me gusta, marca el blog como favorito. Son pequeños gestos que ayudan a mantener el trabajo de creación.

#aboutpedroruizhidalgo

[polldaddy poll=9120832]
♻ miotroblogsite ahorra papel