Fundamentos técnicos de blockchain - 2. Conceptos de seguridad y criptografía en blockchain

in #blockchain7 years ago (edited)

La criptografía de clave pública fue inventada en la década de 1970 y es la base matemática de la seguridad informática.

Desde la invención de la criptografía de clave pública, se han descubierto varias funciones matemáticas adecuadas, tales como exponenciación de números primos y multiplicación de curvas elípticas. Estas funciones matemáticas son prácticamente irreversibles, lo cual significa que son fáciles de calcular en una dirección e inviables de calcular en la dirección opuesta. Basada en estas funciones matemáticas, la criptografía permite la creación de secretos digitales y firmas digitales infalsificables. Todos los blockchains usan prácticamente los mismo principios criptográficos así que por sencillez, usaremos de ejemplo de la red de bitcoin para explicar estos principios.

En la mayoría de blockchains se utiliza la criptografía de clave pública. El par de claves consiste en una clave privada y—derivada de esta última—una clave pública única. La clave pública se usa para recibir transacciones, y la clave privada se usa para firmar transacciones y gastar los fondos asociados a la cuenta (si los hubiera).
Existe una relación matemática entre las claves pública y privada que permiten que la clave privada sea utilizada para generar firmas en mensajes. Estas firmas pueden ser validadas contra la clave pública sin necesidad de revelar la clave privada.

Cuando los fondos son gastados el dueño actual de dichos fondos presenta su clave pública y firma (diferente cada vez, pero creada a partir de la misma clave privada) en una transacción. A través de la presentación de la clave pública y firma, todos los participantes en la red pueden verificar y aceptar la transacción como válida, confirmando que la persona que transfiere los fondos los posee al momento de la transferencia.

Claves Privadas

Una clave privada es simplemente un número escogido al azar. La propiedad y control de una clave privada es la raíz del control del usuario sobre los fondos asociados con la dirección correspondiente. La clave privada se usa para crear las firmas requeridas para firmar transacciones demostrando la pertenencia de los fondos usados en una transacción. La clave privada debe permanecer en secreto en todo momento, ya que revelarla a terceros es el equivalente a darles el control de la cuenta asegurada por dicha clave. También deben hacerse copias de respaldo de las claves privadas para protegerlas de pérdidas accidentales, ya que si se pierde no puede ser recuperada y los fondos asegurados por ella se perderán para siempre.

Claves Públicas

La clave pública es generada a partir de la clave privada usando multiplicación de curva elíptica, la cual es irreversible: (K = k * G) donde k es la clave privada, G es un punto constante llamado el punto generador y K es la clave pública resultante. La operación inversa, conocida como "búsqueda del logaritmo discreto"—calcular k a partir de K—es tan difícil como probar todos los valores de k, es decir, una búsqueda por fuerza bruta.

Direcciones

Una dirección es una cadena de dígitos y caracteres que puede ser compartida con cualquiera que desee enviarte transacciones. En bitcoin, las direcciones producidas a partir de una clave pública consisten de una cadena de números y letras, comenzando por el dígito "1", por ejemplo:

1J7mdg5rbQyUHENYdx39WVWK7fsLpEoXZy

La dirección se obtiene a partir de la clave pública a través del uso de hashing criptográfico de sentido único. Los algoritmos usados para crear direcciones bitcoin a partir de claves públicas son el Secure Hash Algorithm (SHA) y el RACE Integrity Primitives Evaluation Message Digest (RIPEMD), específicamente SHA256 y RIPEMD160. A partir de la clave pública K computamos el hash SHA256 y luego computamos el hash RIPEMD160 del resultado, produciendo un número de 160 bits (20 bytes): donde K es la clave pública y A es la dirección bitcoin resultante.

Es importante destacar que ethereum presenta dos tipos de cuentas y que veremos más adelante, cuentas de usuario y cuentas de contrato. Ambas pueden almacenar fondos pero las cuentas de contrato, como su nombre indica, contienen ademas un smart contract o contrato inteligente con el que se puede interactuar mediante transacciones.

Encriptación y autentificación. Firmas digitales

Para poder gastar mandar transacciones desde una direccion necesitamos demostrar que conocemos la clave privada. Es decir, necesitamos demostrar que conocemos la clave privada, de la clave pública a la que se refiere esa dirección . Y para poder demostrar que conocemos la clave privada sin revelarla públicamente es para lo que se utiliza la firma.
Las firmas son elementos criptográficos que se calculan a partir de la clave privada y de una combinación de otra información incluida en la transacción. Y aquí es donde entra en juego la magia de la criptografía, ya que gracias a ello es posible que una clave pública pueda usarse para verificar que dicha firma se ha creado usando la clave privada correspondiente. Además, como las firmas se calculan utilizando la clave privada y una combinación de otra información de la transacción, permiten demostrar además del conocimiento de la clave privada, que el poseedor de la misma confirma los datos de dicha transacción. Por lo tanto, cada firma es únicamente válida para una transacción específica.

El dueño de la clave privada puede firmar por lo tanto una transacción y gastar fondos sin preocuparse de que nadie vaya a conocer su clave privada porque la clave privada en sí nunca queda expuesta públicamente y además es imposible de averiguar.
La firma y la clave pública de la dirección de la que se envía la transacción se añaden al campo de inputs de la transacción (en Bitcoin se habla de transacciones Input y Output que explicaremos en otro artículo). Y esto demuestra que el propietario de la clave privada tiene realmente la intención de efectuar esa transacción y se asegura de que no puede ser alterada.

Funciones Hash

Un "algoritmo de hashing", o simplemente una "función hash" es una función de sentido único que produce una huella o "hash" a partir de una entrada de tamaño arbitrario. Las funciones de hash criptográfico se usan extensivamente en blockchain para:

  1. Obtención de una dirección a partir de una clave pública como se ha descrito anteriormente
  2. Durante en el minado en la prueba de trabajo para ganar el reto (en caso de usar este algoritmo de consenso). Esto se describirá en capítulos posteriores.
  3. Para generar los árboles Merkle que se incluyen en los bloques minados y que se explicarán también en futuros artículos.

Y con esto acaba este artículo. Espero que no haya sido demasiado pesado, pero es importante conocer los principios básicos criptográficos en los que se apoya blockchain y que le dan algunas de las características que lo hacen tan especial como su seguridad e inmutabilidad.