Páginas

miércoles, 21 de febrero de 2018

Resumen Typescript

Hola

En esta entrada dejo un repaso bastante completo al lenguaje de programación Typescript.

Todos los ejemplos de este resumen están basados en la documentación disponible en:

     https://www.typescriptlang.org/docs/handbook/basic-types.html
     https://www.tutorialspoint.com/typescript/index.htm

Para ejecutar cualquiera de los ejemplos deberíamos lanzar:

     tsc 001-tipos-basicos.ts     // Compila a javascript
     node 001-tipos-basicos.js    // Ejecuta el código en consola

La lista completa de ejemplos es:

001-tipos-basicos.ts
002-constantes-variables.ts
003-String.ts
004-Arrays.ts
005-estructuras.ts
006-operadores.ts
007-interfaces.ts
008-clases.ts
009-clasesDos.ts
010-funciones.ts
011-recursividad.ts
012-callbacks.ts
013-secuencial.ts
014-promesas.ts
015-generics.ts
016-generics2.ts

El enlace al zip con todos los ejemplos es el siguiente:

     https://mega.nz/#!lZomnICb!XvUZiEsC1BBlkt517LHQU4Gp4A5x9sZWC-3D0t5WuUQ

viernes, 9 de febrero de 2018

Introducción a blockchain y futuros problemas

Conceptos previos

Antes de empezar conviene recordar que blockchain se basa en un sistema criptográfico llamado RSA y en el concepto de huella electrónica.

Sistema RSA

En el sistema criptográfico RSA, cada participante es propietario de dos claves, una pública (disponible para cualquier otro usuario del sistema) y otra privada (exclusiva del usuario y que debe ser protegida).

Ambas claves están asociadas de forma que la operación que se realiza con una de las claves se puede deshacer con la otra clave.

En el sistema RSA cualquier usuario A puede firmar electrónicamente un documento (normalmente se firma una huella del documento y no el documento completo) con su clave privada y enviarlo a un usuario B. Como el usuario A firma con su clave privada, únicamente conocida por A, la firma garantiza que fué el usuario A quien firmó el documento. El usuario B, tras recibir el documento, puede disponer de la clave pública del usuario A (el firmante) para verificar que lo firmó A y que el documento no ha sido adulterado tras la firma.

En el sistema RSA cualquier usuario A puede enviar un documento encriptado a un usuario B, para encriptar el documento el usuario A obtiene la clave pública del usuario B y con dicha clave cifra el documento y lo envía. El documento cifrado sólo puede ser descifrado con la clave privada que posee el usuario B, por lo que aun siendo interceptado el documento por un tercer usuario, éste no podría leer el documento.

Al par de certificados que posee cada usuario se le llama certificado

Los certificados son emitidos por ciertas entidades (autoridades certificadoras) en las que confían implícitamente todos los participantes del sistema.

Huellas electrónicas

Existen procedimiento computacionales capaces de generar un extracto único de cualquier fichero. Dicho extracto se llama huella electrónica y tiene unas características especiales:

  • No es posible obtener el documento original a partir de la huella
  • No es posible encontrar un documento distinto que genere la misma huella (sería posible, pero serían millones de años de pruebas)
  • La huella tiene siempre el mismo tamaño (por ejemplo 256 bits) independientemente del tamaño del documento original
  • Si un documento resulta cambiado aunque sea una coma, la nueva huella electrónica es completamente distinta de la anterior
  • La generación de la huella es muy muy rápida

Conceptos generales de blockchain

Es una base de datos distribuida donde se almacena una CADENA de BLOQUES.

La cadena de bloques está REPLICADA en cada uno de los servidores de la red, a los que se llama MINEROS. Hay miles de servidores en la red de bloques, por lo que hay MILES DE COPIAS de la CADENA.

Cada bloque almacena las N transacciones que se han realizado en un cierto intervalo de tiempo.

La cadena de bloques sigue una secuencia temporal, cada bloque apunta al bloque anterior (a la huella HASH su bloque antecesor), por lo que siguiendo la secuencia de bloques tenemos la secuencia de transacciones de todos los usuarios del sistema desde que éste arrancó en el 2009. Es por tanto posible recorrer la cadena de bloques y recopilar el 'historial' de transacciones que un usuario del sistema ha realizado.

Si un nodo de la red (MINERO) fallase, no se pierde la información dado que hay miles de nodos adicionales.

Ninguno de los BLOQUES de la CADENA puede ser alterado dado que eso cambiaría su huella y rompería la cadena al quedar DESCONECTADO de su bloque sucesor. Esta alteración de un bloque en uno de los N servidores (MINEROS) se detecta inmediatamente al existir MILES de copias de la cadena.

Cada uno de los BLOQUES almacena N transacciones, el tamaño del bloque viene determinado por el número de usuarios y por la capacidad de cómputo necesaria para que los MINEROS generen la HUELLA del bloque. El formato de los bloques es el siguiente:

  CABECERA -> Tiene la huella hash del bloque anterior
  DATOS    -> Con un total de N transacciones
    TRANSACCION de un usuario
    TRANSACCION de un usuario
    TRANSACCION de un usuario
    ...
    TRANSACCION de un usuario
    TRANSACCION final del minero que cierra el bloque
  HUELLA   -> Huella SHA del presente bloque

Cada una de las transacciones almacenadas en un BLOQUE de la cadena tiene los siguientes datos:

  Clave pública del usuario A.
  Clave pública del usuario B.
  Dato transferido que podría estar cifrado para que únicamente B lo lea.
  Huella del dato transferido.
  Firma electrónica del dato por parte de A.
  Firma electrónica del dato por parte de B.

Participantes en blockchain

En blockchain únicamente hay tras roles:

  Usuarios que registran transacciones por pares
  Mineros que almacenan las transacciones
  Entidades certificadores que generan el par de claves (certificado) que identifica a cada usuario y cada minero

Funcionamiento de blockchain

El sistema tiene en líneas generales el siguiente funcionamiento:

Un usuario A quiere realizar una transaccion con un usuario B, con lo que envía su solicitud de transacción al MINERO de la red BLOCKCHAIN mas cercano. Dicha solicitud lleva:

  Clave pública del usuario A.
  Clave pública del usuario B.
  Dato transferido que podría estar cifrado para que únicamente B lo lea.
  Huella del dato transferido.
  Firma electrónica del dato por parte de A.

El MINERO de A almacena la transaccion en el bloque actual (el que todos los nodos de la red están rellenando con las transacciones de los últimos N minutos) y transmite la transaccion a los restantes MINEROS de la red (para que la almacenen en su copia del nodo actual) y uno de ellos la entrega al usuario B, quien la firma electrónicamente con lo que la transaccion ya yiene:

  Clave pública del usuario A.
  Clave pública del usuario B.
  Dato transferido que podría estar cifrado para que únicamente B lo lea.
  Huella del dato transferido.
  Firma electrónica del dato por parte de A.
  Firma electrónica del dato por parte de B.

La transaccion completa es entregada el MINERO de B que la propaga al restante grupo de mineros.

Cuando el bloque actual está casi completo (sólo cabe una transaccion mas), todos los mineros compiten por generar la HUELLA SHA256 de ese último bloque. Esta huella no se genera de la forma habitual (que sería un proceso casi inmediato) sino que tiene que cumplir cierta restricción que precisa mucho tiempo de computación. La restricción es que los N primeros bits de la huella SHA256 deben ser ceros.

Los MINEROS compiten por generar esa huella y quien la genera cierra el bloque (que aloja como última transacción que fué el minero X quien cerró el bloque) y propaga el bloque cerrado al resto de MINEROS para que arranque un nuevo bloque en la cadena.

Por cada bloque cerrado un MINERO recibe una importante cantidad de DINERO. Dinero que invierte en instalaciones y equipos informáticos que le permiten COMPETIR mejor con los restantes mineros para tener capacidad de cómputo suficiente como para cerrar un % mayor de los bloques.

Se cierra un bloque cada 10 minutos, por lo que todos los mineros tienen un fuerte incentivo económico.

Aplicaciones de blockchain

El sistema blockchain tiene potencial para cambiar muchos de los sistemas que operan hoy en día en el mundo dado que elimina intermediarios y registros privados:

  • Mis datos bancarios son una secuencia de operaciones de dos tipos, operaciones de cobro (nómina) y de pago (mis gastos), por tanto no necesito que únicamente sean los ordenadores de mi banco (unos cuantos MINEROS de su red privada) quienes guarden esa información y/o el dinero físico, puedo confiar en una criptomoneda y en la red de miles de MINEROS de blockchain. Evito así problemas de quiebras bancarias o problemas de corralitos en países inestables.
  • Las transferencias de dinero que realizan los emigrantes a sus países de destino pueden prescindir de entidades intermediarias si se realizan en criptomonedas basadas en blockchain
  • Los contratos de compraventa de propiedades (coches, terrenos, casas, etc) pueden realizarse entre pares prescindiendo de notarios y de un registro centralizado de la propiedad
  • El historial sanitario de una persona no tiene porqué estar almacenado en N hospitales, pertenece a la persona que lo almacena en blockchain
  • El registro de la propiedad intelectual (músicos, escritores, patentes, etc) no tiene que estar gestionado por N registros nacionales sino que puede ser universal y quedar almacenado en blockchain

Futuros problemas del blockchain

Tras este resumen quedan aún muchos detalles pendientes de aclarar:
  • ¿Todas las transacciones son por pares?
  • ¿Qué ocurre si al cabo de los años una CA grande que generó miles de certificados desaparece?
  • ¿Qué pasaría si un gigante tipo Google con millones de nodos entrase como minero?
  • ¿Cuanta energía se consume en labores de minería?
  • Si se usa blockchain de forma masiva ¿cuantas transacciones pueden registrarse por segundo?
  • Si se usa blockchain de forma masiva ¿será manejable el tamaño de la lista de bloques?
  • Si se quiere confidencialidad se deben cifrar los datos de la transacción antes de añadirla a un bloque, pero ¿cómo garantizamos que esos datos sigan estando protegidos dentro de 25 años cuando la técnica deje obsoletos los mecanismos de cifrado actuales?
  • Si en un futuro son los gobiernos quienes impulsan las criptomonedas y registran el 100% de nuestras transacciones, ¿donde queda la privacidad? y ¿quien garantiza que esos datos no terminan llegando a manos privadas?

Referencias
  • https://es.wikipedia.org/wiki/Cadena_de_bloques
  • https://www.youtube.com/watch?v=hEoYL5j0wYU
  • https://www.youtube.com/watch?v=9INjZuOVLfg
  • https://www.youtube.com/watch?v=ayRkvlC31y8
  • https://www.youtube.com/watch?v=44D9nVxqGIE

sábado, 3 de febrero de 2018

Ejecutar synaptic desde un lanzador Gnome en Ubuntu 17.10

Hola

Tras instalar Ubuntu (en este caso la versión 17.10) he visto que tras instalar synaptic (sudo apt-get install synaptic) no conseguía ejecutarlo ni desde el lanzador Gnome ni desde la línea de comandos con el tradicional (sudo synaptic).

Googleando un poco parece ser porque han limitado los permisos del root para lanzar aplicaciones gráficas. Para solventarlo he movido el lanzador predefinido tras la instalación desde la carpeta por defecto (donde aplica todos los usuarios del sistema) a mi carpeta $HOME:

sudo mv synaptic.desktop /home/egdepedro/.local/share/applications/

Seguidamente he cambiado los permisos del fichero:

sudo chown egdepedro:egdepedro synaptic.desktop

Por último he editado el lanzador (vi synaptic.desktop) ajustando la línea Exec con:

[Desktop Entry]
Name=Synaptic Package Manager
GenericName=Package Manager
Comment=Install, remove and upgrade software packages
Exec=bash -c 'xhost +SI:localuser:root; pkexec synaptic'
Icon=synaptic
Terminal=false
Type=Application
Categories=PackageManager;GTK;System;Settings;
X-Ubuntu-Gettext-Domain=synaptic

El comando da permisos al usuario root para lanzar aplicaciones gráficas y seguidamente lanza el synaptic.

Esto es todo

viernes, 2 de febrero de 2018

Sobreescribir vs borrar un disco duro

¿Porqué es mejor sobreescribir que formatear un disco para limpiar su contenido?

Todo disco duro que hayamos tenido en nuestro poder suele tener datos personales que comviene borrar. Si el disco va a ser utilizado por terceros conviene asegurarnos de borrar correctamente su contenido.

Hay varias formas de abordar el problema:

1) Borrar los ficheros personales

Es muy poco recomendable dado que cuando borramos un fichero de nuestro disco duro lo que realmente estamos haciendo es borrar la referencia de dicho fichero de la tabla de contenido del disco, por lo que en realidad esos 'bloques de disco' quedan disponibles para ser sobreescritos con los datos de nuevos ficheros que entrasen en el disco.

Como el borrado de la referencia en la tabla de contenido no implica el borrado real de los datos del fichero, los datos que creemos borrados permanecen en el disco mucho tiempo si no tenemos la 'suerte' de que sean sobreescritos por un nuevo fichero que se almacene en el disco.

Hay además mucho software especializado en recuperar ficheros borrados que cualquier persona maliciosa que hubiese heredado nuestro disco podría usar.

2) Formatear de forma rápida el disco

Es un método tan malo como el anterior. Un formateo 'rápido' del disco es en realidad un borrado completo de la tabla de contenido del disco, por lo que en realidad los 'bloques de disco' siguen teniendo los mismos datos que antes del formateo y siguen siendo 'recuperables' mediante un software especialidado por cualquier persona maliciosa que hubiese heredado nuestro disco.

3) Formatear de forma segura el disco

Es un método mucho mas seguro que los anteriores, en este caso además de borrar completamente de la tabla de contenido del disco, se escriben 'ceros' en toda la superficie del disco, por lo que la recuperación de los datos es ya imposible sin software/hardware muy muy especializado.

4) Sobreescribir el disco

Si el método anterior sobreescribe todo el disco con ceros, ¿cómo puede ser recuperado el anterior contenido del disco?.

La explicación es muy simple:
  • Primero debemos recordar que los datos de un disco son almacenados magnéticamente, cuando grabamos un cero en un disco estamos orientando una pequeñísima cantidad de material ferromagnético de una posición específica (plato/cabeza/cilindro/pista/sector) en modo N-S. Si grabamos un uno el mismo 'iman' queda orientado en modo S-N.
  • Si nuestro fichero tuviese el contenido '1010110', lo tendríamos almacenado en el disco con S-N,N-S,S-N,N-S,S-N,S-N,N-S. Si borramos el disco sobreescribiendo todo con ceros tendríamos '0000000' y los imanes tendrían N-S,N-S,N-S,N-S,N-S,N-S,N-S con lo que todo parece correcto y la información anterior es irrecuperable.
  • Pero todo lo anterior es correcto en un mundo digital, en un mundo analógico uno de esos mini-imanes que tenía cero (N-S) y ha pasado a tener uno (S-N) tiene una intensidad de campo magnético 'inferior' a la que tendría un iman sobre el que se hubiesen grabado muchas veces seguidas un uno (S-N). Imaginemos que en el primer caso la intensidad del campo magnético (S-N) es de un 85% y en el segundo caso de un 99%, siendo ambos valores leídos como uno por un brazo de disco normal. Pero existen lectores mas sensibles capaces de detectar esa diferencia y por tanto inferir que el uno que se lee al 85% era antes un cero mientras que el uno que se lee al 99% era antes un uno por lo que el formateo de disco con una única sobreescritura de ceros en todo el disco es 'hackeable'.
El borrado mas seguro es el que realiza varias sobreescrituras del disco con datos aleatorios (cuantas mas sobreescrituras completas mejor) y finalmente unos cuantos formateos seguros del disco donde se ponga todo a ceros. Así minimizamos las posibles fluctuaciones de intensidad en cada 'iman' del disco.

Eso es todo