Stamping.io plataforma que emitir, transferir, presentar y validar credenciales verificables con pruebas Blockchain

Stamping.io
9 min readAug 9, 2021

--

Modelo de confianza de una credencial verificable e identidad digital

Resumen

Aún recuerdo los enormes cuadros que adornaban la sala de mi casa, probablemente usted también recuerde lo orgulloso que eran sus padres (o quizás usted mismo), en publicar sus logros educativos (títulos y/o certificados) en las paredes de su hogar u oficina, guardados cuidadosamente para evitar arrugas; sin embargo, para la mayoría, lo más probable es que no vuelvan a tocar esos papeles, excepto ocasionalmente para fotocopiar o escanear los registros educativos cuando busca un nuevo empleo o cumplir con algún requisito para iniciar un nuevo programa de estudio.

La tecnología avanza muy rápido, hasta el día de hoy, podríamos pensar que la forma de recibir, guardar y presentar nuestros grados académicos, hoy en día, ya no es usando papeles voluminosos que acumulan polvo; sino que, tenerlos en uno digital.

Muchas empresas, impulsadas por el COVID, están tratando de implementar proyectos para crear documentos digitales basados en archivos pdf utilizando firmas digitales; pero no es a esa solución a la que nos referimos en este artículo, sino que nos centraremos en la forma cómo utilizar credenciales verificables.

Sin embargo, el almacenamiento, la capacidad de presentarlo a un tercero y la verificabilidad de sus certificados sigue siendo un proceso engorroso. Especialmente en un mundo en el que cada vez somos más ciudadanos del mundo.

Este artículo explica de manera sencilla, para que sirve, cómo crearlos, por qué usar la blockchain, y sobretodo, demostrar que es una forma inteligente para interoperar entre una o varias organizaciones que no necesariamente se conocen.

El problema

Quizás una de las secciones más difícil de escribir es ésta, cómo puedo decirle a alguien que tiene un problema cuando no siente el dolor de ello, por lo que, le pido disculpas por este atrevimiento; aunque luego de leer este artículo, es probable, que me de la razón.

Métodos de creación de documentos digitales

Existen 3 formas de hacerlo:

Digitalizar
Es la manera más sencilla de implementar, es digitalizar los documentos que están impresos, escanearlos en presencia de un fedatario juramentado en informática y almacenarlo en un ambiente que ofrezca la seguridad del caso.

Documentos firmados digitalmente
Son documentos PDF que se firman usando un software y una credencial de firma digital válida de acuerdo al marco legal de cada país. Estos documentos son una representación digital del documento que contiene un mecanismo seguro y respaldado legalmente que garantiza la integridad del contenido y la manifestación de voluntad del emisor (firmante).

Credenciales verificables
Son archivos, por lo general basados en documentos JSON (de acuerdo a los lineamientos de la w3.org) que permiten transportar datos que son firmados digitalmente por un emisor donde se afirma algo de un sujeto. A diferencia de un documento PDF, estas credenciales pueden contener un estado, es ahí donde la Blockchain funciona perfectamente, pensemos:

Si un documento dice que Juan debe pagar 1000 USD mensuales a Luis, pero 5 días después, acuerdan firmar un nuevo documento donde se revoca ese contrato, si alguno de ellos no muestra este nuevo documento, nadie podría saber que fue revocado, salvo que alguno de ellos cuente con en nuevo archivo, de por sí, el documento PDF no puede saber el estado del archivo, salvo que se recurra a consultar a un sitio web, lo que conlleva a manifestar que es centralizado, la pregunta, que se convierte en el reto central de este artículo, es: ¿Quién se encargaría de llevar ese registro?

La Solución

Probablemente es simple: Usar una red blockchain de confianza, lo digo de esta forma, por que hoy en día nacen tantas redes, que tomar una decisión de ¿cuál es la adecuada para mi organización o caso de uso? no es una algo que debe tomarse a la ligera.

La blockchain funciona como una “base de datos distribuida” entre 2 o más participantes, es una red integrada entre varias computadoras que comparten y almacenan la misma información, que haciendo uso de criptografía, nadie la puede manipular.

La solución que estamos proponiendo de utilizar en este artículo se basa en estos componentes:

  • Contrato desplegado en una red Blockchain
  • Documento JSON

Componente 1: Contrato desplegado en una red Blockchain

Dentro de una plataforma Blockchain se puede desplegar contratos, conocidos como smart contract, que pueden llevar un registro de los identificadores (hash) de cada documento PDF (en caso de firmas digitales) o del contenido del documento JSON (credenciales verificables); así como: registrar la firma del emisor, la identificación del sujeto y/o titular, la fecha de creación y el estado del documento.

La ventaja de utilizar un contrato desplegado en una red Blockchain, es que funciona de manera descentralizada, pública y transparente, dando posibilidad a implementar distintos casos de usos; donde se requiere el intercambio de documentos digitales entre dos o más organizaciones.

Existen varias formar de hacerlo, nuestra recomendación es usar algunos de los estándares que propone Stamping.io y que esta basado en contratos EIP1812, usando el “hasheo” basado en EIP712.

Registro de credenciales
El contrato debe contener un método para registrar las credenciales con la siguientes especificaciones:

Interfaz del contrato de registro de credenciales

Stamping.io propone que la firma de la transacción sea realiza por el sujeto de la credencial, debido a que la firma del emisor se encuentra enviada como parámetro. Esta técnica le ayudará a solucionar el problema de concurrencia del firmado debido al “nonce” que debe ser firmada en una transacción que es enviada a la blockchain.

Por otro lado, esta firma le sirve como “cargo de recepción”, donde la sola presencia en la red Blockchain, demostraría que fue firmada con la llave privada del sujeto de la credencial.

Solo debe enviar el hash de la credencial (_credentialHash), no es recomendable enviar datos (así estén encriptados), ya que serán públicos y puede vulnerar la privacidad y/o confidencial de la información.

Revocar credencial
El emisor (issuer) de la credencial, puede ejecutar este método si desea revocarla, la ventaja es que será pública para cualquier verificador podrá comprobar el estado de la credencial en cualquier momento y ser alertado, cuando eso pase. ¿Espero que ya se hayan dado cuenta de este potencial?

Interfaz del contrato de revocación de credenciales

Verificar la credencial
Cualquier persona puede validar una credencial verificable haciendo una llamada (CALL) a esta función del contrato. Esta función devuelve los siguientes estados:

  • Si existe la credencial.
  • Si no ha sido revocada.
  • Si la firma es correcta. (v,r,s)
  • Si se requiere de firmas adicionales.
  • Si ha expirado o vencido.
Interfaz del contrato que permite verificar las credenciales

Componente 2: Documento JSON

Los documentos que conforman una credencial verificable tienen este formato:

Ejemplo de una credencial verificable emitida por el Ministerio de Salud del Perú para demostrar vacunación COVID

Todas las credenciales verificables típicas están conformadas en 3 partes:

  • Metadata de la credencial
  • Datos (claims)
  • Firmas del emisor (proofs)

El uso de la blockchain en las credenciales son para verificar la existencia de la credencial en un momento del tiempo (sello de tiempo), verificar la integridad del documento, el mismo que podría ser adulterado por un titular; sin embargo, si bien es cierto que la credencial puede ser verificada su integridad sin necesidad de validarlo en la blockchain, el estado de dicha credencial, puede ser realizada a través de una consulta a un contrato dentro de la red blockchain, sin la necesidad de tener que centralizarlo en un sistema que puede ser un punto vulnerable. También es posible realizar pruebas de propiedad, dado que el emisor registrará en la blockchain el sujeto a quien le emite la credencial.

Stamping.io tiene ciertas particularidades que facilita el proceso de emisión donde se requiere de un alto tráfico, además que permite que estas credenciales puedan ser verificadas, en ciertos casos, sin necesidad de tener acceso a internet y/o acceso a la red Blockchain.

Metadata
Contiene información que le permite a las aplicaciones identificar el contexto o esquema que se está utilizando para formatear los datos; sobretodo, en la información que se encuentra en el atributo: credentialSubject. Tenga en cuenta que la metadata es solo reglas de conformación y definición de la estructura, no de los datos. El tipo (type) y términos de uso (termsOfUse) de la credencial, también es parte de esta metadata.

Datos
Una credencial cuenta con la siguiente información útil que deberíamos considerar como datos necesarios para entender la afirmación que el emisor realiza sobre un sujeto. Esta información se encuentra en ciertos atributos que deben respetarse en cuanto al nombre y tipología, veamos los principales:

  • id: identificador de la credencial, debe ser un código único como: uuid, uri o urn. Asegúrese que siempre sea un valor único.
  • issuer: Es el identificador del emisor, en el caso de Stamping.io, las credenciales se emiten usando esta estructura: did:ethr:stamping:<0xaddress>, la dirección debe ser compatible con ethereum, puede ser de una billetera o un contrato. Stamping.io usa este contrato: 0x6406a09cC1E91AA8B56BeaAD31D5966151e889A7 basado en este ABI: https://ipfs.io/ipfs/QmRG9rTCcDdAvK2XwRvTr8HpXnveSAFp4RiZDBtAf9R8dB, donde las aplicaciones utilizan la función la funcion entityOf(address) para verificar la identidad del emisor.
  • issuanceDate: Contiene la fecha de inicio de vigencia de la credencial. Se debe usar el formato ISO.
  • expirationDate: Contiene la fecha de término de vigencia de la credencial. Se debe usar el formato ISO.
  • credentialSubject: Contiene la información referente a la afirmación de la credencial, el esquema de esta estructura puede contener un array o una lista de atributos simples, complejos o anidados, no existe una regla, cada emisor es libre de diseñarlo como mejor le parezca, salvo algunos casos que se están creando taxonomías para interoperar.

Proof(s)
Es información que le permitirá al verificador comprobar la integridad, propiedad y existencia de una credencial verificable. Stamping.io propone dos tipos de pruebas.

Prueba Tipo 1: assertionMethod de tipo EcdsaSecp256k1Signature2019
Este tipo de firma es propuesto y/o usado por la comunidad de LACChain y uPORT, por ejemplo:

{
“created”: “2021–07–30T18:08:13.273Z”,
“creator”: “did:ethr:lacchain:0xAdF7E4F9eC79…E38753EB2b”,
“type”: “EcdsaSecp256k1Signature2019”,
“proofPurpose”: “assertionMethod”,
“verificationMethod”: “did:ethr:lacchain:0x5Ed4a0…42637ed6F8510c”,
“networkId”: “0x9e551”,
“domain”: “0xD6192F205bc4F1ad25824A35C644CEE3B283916d”,
“proofValue”: “0x629c57a5e9c0…2253b2420e2889a47cbbe528b51c”
}

Se puede verificar en forma desconectada la firma (sin internet), solo debe calcular el hash de la credencial de acuerdo a la especificación EIP712 y validar en el atributo proofValue si ha sido firmado por el emisor (issuer).

Cálculo del Hash

Cálculo de VERIFIABLE_CREDENTIAL_TYPEHASH
web3Utils.soliditySha3( “VerifiableCredential(address issuer,address subject,bytes32 data,uint256 validFrom,uint256 validTo)” );

Cálculo de EIP712DOMAIN_TYPEHASH
web3Utils.soliditySha3( “EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)” );

Cálculo de encodeEIP712Domain
web3Abi.encodeParameters(
[‘bytes32’, ‘bytes32’, ‘bytes32’, ‘uint256’, ‘address’],
[
EIP712DOMAIN_TYPEHASH,
web3Utils.sha3( “EIP712Domain” ),
web3Utils.sha3( “1” ),
648529,
<0xAddres contract>
]
);

Cálculo de hashHex
“0x”+sha256(JSON.stringify( vc.verifiableCredential[0].credentialSubject));

Cálculo de hashEIP712Domain
web3Utils.soliditySha3( encodeEIP712Domain );

validFrom = new Date( vc.verifiableCredential[0].issuanceDate ).getTime();
validTo = new Date( vc.verifiableCredential[0].expirationDate ).getTime();

Cálculo de subjectAddress
vc.verifiableCredential[0].credentialSubject.id.split( ‘:’ ).slice( -1 )[0];

Cálculo de encodeHashCredential
web3Abi.encodeParameters(
[‘bytes32’, ‘address’, ‘address’, ‘bytes32’, ‘uint256’, ‘uint256’],
[
VERIFIABLE_CREDENTIAL_TYPEHASH,
issuer,
subjectAddress,
hashHex,
Math.round( validFrom / 1000 ),
Math.round( validTo / 1000 )
]
);

Cálculo de hashCredential
web3Utils.soliditySha3( encodeHashCredential );

Cálculo de encodedCH
web3Abi.encodeParameters(
[‘bytes32’, ‘bytes32’],
[
hashEIP712Domain,
hashCredential.toString( 16 )
]
);

Retorna el hash EIP712:
web3Utils.soliditySha3(‘0x1901’+encodedCH.substring( 2,131));

Si desea verificar el estado de la credencial deberá conectarse a la red (networkid), en el caso de ser 0x9d551 significa que es LACChain, y luego ejecutar la función de verifyCredential enviando como parámetros los datos de la credencial y los datos de la prueba de firmado (proofValue).

Tipo 2: assertionMethod de tipo EthereumAttestationRegistry2019

Para validar este método de firmado debe calcular el hash de los datos que se encuentran en la etiqueta <credentialSubject> y deberá verificar en la etiqueta proofValue que ese hash haya sido firmado por el emisor (issuer).

Si se desea verificar el estado de la credencial en la blockchain, debe calcular el hash de toda la credencial, incluyendo el proof, ese hash debe ser enviado como parámetro al contrato que se encuentra en la etiqueta <contractAddress> a la función: verifications[hash, issuerAddress] si retorna true, significa que existe, n o ha sido revocada y que la firma es correcta.

También podemos incluir una prueba adicional con firmas digitales usando certificados emitidos por autoridades acreditadas de acuerdo a la jurisdicción en donde operan. En Latinoamérica y el centro américa, estamos integrados con el software de firmas digitales de BigDavi.

Esperamos que esta información les ayude a crear sus primeras credenciales verificables, las mismas que puede probarlas descargando la aplicación StampingID. Mayor información puede conectarse con jose.zarate@stamping.io o visite nuestro sitio web: www.stamping.io

--

--

Stamping.io

Stamping.io es una red de nodos Blockchain que permiten estampar evidencias digitales para demostrar su existencia en un momento del tiempo.