Hacemos autenticación web a través de blockchain


Recientemente participé en el hackathon Ethereum, y hoy quiero hablar sobre el proyecto EtherAuth, con el cual el equipo MixBytes tomó el tercer lugar. EtherAuth es un intento de hacer una versión descentralizada del inicio de sesión del sitio utilizando una cuenta externa. Como botón, inicie sesión a través de Facebook, solo sin Facebook.


Problema y soluciones


Si desea crear un área cerrada para los usuarios en su sitio web, debe elegir: desarrollar su propio sistema para identificar, autenticar y autorizar a los usuarios, o utilizar una solución preparada. Una solución llave en mano significa que su usuario ya tiene una cuenta en algún sistema (Facebook, Google, Yahoo, Outlook o incluso solo correo electrónico). Y utiliza el mecanismo apropiado (con mayor frecuencia el protocolo OAuth 2.0) para asegurarse de que alguien que intente iniciar sesión en su sitio utilizando una ID de usuario externa sea este usuario.


La última opción es más fácil de implementar, pero existe un riesgo para el usuario: si algo le sucede a su cuenta principal (por ejemplo, Facebook bloqueará la cuenta sin dar razones), también perderá el acceso a su información en su sitio.
Además, si como usuario quiero iniciar sesión en un sitio en el que todavía no confío, me enfrento a la necesidad de proporcionar a este sitio acceso a mi información personal, como el correo electrónico o la edad. Si el sitio solo admite el inicio de sesión con una cuenta externa, literalmente debo tomar una decisión: negarme a usar el sitio o sacrificar mi anonimato.


La mayoría de los usuarios terminan sacrificando el anonimato con las palabras "entonces, qué terrible puede suceder, no tengo nada que ocultar". Desafortunadamente, la mayoría de los ataques dirigidos a un usuario no preparado y que terminan en pérdida de dinero comienzan con palabras similares. "¿Qué terrible puede pasar si envío un código de SMS a un empleado del banco?" "¿Qué cosa terrible puede suceder si le envío a un empleado de soporte técnico los encabezados de solicitud?" La respuesta a esta pregunta se encuentra con mayor frecuencia cuando no se puede hacer nada.


¿Cómo puede ayudar Ethereum aquí? Ya nos dimos cuenta de que hay tres problemas principales:


  1. El usuario no está obligado a confiar en el sitio que visita y quiere evitar la filtración de información personal.
  2. El sitio quiere usar un sistema de autenticación externo para evitar almacenar datos de usuario y los costos de seguridad asociados.
  3. Los sistemas externos existentes que brindan a los sitios la capacidad de autenticar a los usuarios conllevan el peligro de la censura. Cualquier cuenta puede bloquearse en cualquier momento sin explicación y, a veces, sin posibilidad de recuperación.

Podemos usar la red Ethereum en lugar de un sistema externo y almacenar solo el conjunto de datos necesarios en ella. Debemos tener cuidado de no almacenar información secreta en el dominio público, pero dado que cualquier billetera en la red Ethereum es en realidad un par de claves criptográficamente fuertes, en las que la clave pública determina la dirección de la billetera, y la clave privada nunca se transmite a través de la red y es conocida solo por el propietario, Podemos utilizar cifrado asimétrico para autenticar a los usuarios.


En el caso más simple, puede usar la dirección de la billetera Ethereum como ID de usuario. Pero aquí surge un problema: en caso de una fuga de clave, el usuario pierde el acceso al sistema para siempre. Más precisamente, desde el momento en que el atacante conoce la clave secreta del usuario o simplemente cae accidentalmente en el acceso público, no podemos usar dicha clave para la autenticación.


Implementación


En nuestra solución, escribí un simple contrato inteligente EtherAuth para almacenar ID de usuario y direcciones de billetera asociadas. El ID de usuario es solo una cadena UTF-8 con un tamaño de entre 2 y 32 bytes. Es inventado una vez por el propio usuario y luego se utiliza para iniciar sesión en cualquier sitio que admita EtherAuth. Hoy agregaría una restricción sobre los posibles caracteres incluidos en la cadena, dejando la posibilidad de usar caracteres latinos y números arábigos (subconjuntos de codificación ASCII de 7 bits) para limitar la capacidad de crear inicios de sesión externos similares.


Al crear una cuenta en EtherAuth, se configura un par de claves: una clave de autorización (authAddr) y una clave para restaurar el acceso (recoveryKey). El nombre recoveryKey no es del todo exitoso, porque esta dirección se usa para administrar la cuenta, y no solo para la recuperación. Al crear, ambas direcciones son iguales a la dirección de la billetera en nombre de la cual se envió la transacción. Pero un usuario que se preocupa por su seguridad debe crear una clave de control separada y almacenarla en un lugar inaccesible a través de la red. Incluso lo guardaría en papel en una caja fuerte en forma de 12 palabras mnemotécnicas, permitiendo, si es necesario, recrear un par de claves.


También es aconsejable utilizar una dirección de billetera separada para la autenticación, separándola de la dirección de billetera en la que se almacena todo su Ether. La relación de authKey con la dirección de la billetera que creó la cuenta todavía se puede rastrear analizando la secuencia de transacción del contrato inteligente. Ahora no puede establecer una authKey y recoveryKey por separado al crear una cuenta. Sin embargo, si refina el contrato inteligente en esta dirección, la dirección que creó la cuenta no estará necesariamente asociada con el propietario de la cuenta, lo que permitirá a todos proteger su anonimato.


Para la interacción del usuario con el contrato inteligente, creamos una página web separada. Puede crear una cuenta en él, cambiar sus claves o eliminarlo. Para trabajar, el usuario deberá instalar el complemento del navegador MetaMask. Si ya está utilizando activamente la red Ethereum, lo más probable es que ya haya instalado este complemento, es decir, la mayoría de los usuarios que desean ingresar al sitio a través de Ethereum no encontrarán un obstáculo adicional en su camino.


El proceso de autenticación de usuario general que usa EtherAuth se ve así:


  • El sitio (backend) se convierte en un contrato inteligente y recibe la dirección Ethereum del usuario;
  • El sitio (backend) genera y recuerda algunos mensajes y le pide al usuario que firme este mensaje usando la dirección authKey;
  • El usuario, estando en el sitio (frontend), firma el mensaje utilizando el complemento MetaMask y lo envía al backend;
  • El sitio (backend) verifica la firma, y ​​si todo está en orden, activa la sesión del usuario de acuerdo con la lógica elegida.

En nuestra solución para el hackathon, por simplicidad, combinamos las partes de backend y frontend, obtuvimos una gran interfaz. En la vida real, es importante que la verificación de autenticación se realice en un entorno no controlado por el usuario, es decir, no en el navegador, sino en el servidor.


De los problemas que encontramos, podemos observar la verificación de la firma en la parte frontend. No había soporte para las curvas elípticas en el navegador, por lo que tuve que agregar una función al contrato inteligente que devuelve el resultado encubierto del mensaje y aprender a pasar parámetros correctamente (obtenerlos de un mensaje firmado por MetaMask).


Como resultado, en dos días recibimos una prueba de concepto de autenticación descentralizada utilizando la red Ethereum y el complemento MetaMask. Entendemos cómo refinar este sistema para agregar anonimato al usuario. El usuario puede restaurar el acceso en caso de una fuga de su clave principal (pero no en el caso de una fuga de la clave de recuperación). Un sistema descentralizado no está sujeto a la censura de grandes estructuras como Google o Facebook. Si la censura es necesaria, el sitio debe llevarla a cabo por sí solo, pero solo puede hacerlo dentro de su propio sistema, sin afectar el acceso del usuario a otros sistemas. La red Ethereum no realiza transacciones muy rápidamente (al crear una cuenta, el usuario puede tener que esperar unos minutos), pero es posible obtener datos y verificar la autenticación del usuario muy rápidamente. Esta solución escala bien, ya que hay muchos nodos con datos, y cualquiera puede agregar uno más en cualquier momento. La complejidad de implementar dicha solución para los propietarios de sitios no es mayor que la complejidad de implementar el soporte para OAuth 2.0.


Conclusión


Por supuesto, hoy en día los usuarios que usan la red Ethereum son insignificantes en comparación con la cantidad de usuarios de Facebook. Sin embargo, la popularidad de las tecnologías blockchain está creciendo, y creo que en el futuro previsible habrá cada vez más usuarios, lo que significa que será posible utilizar la autenticación descentralizada en los sistemas industriales.


Referencias


Source: https://habr.com/ru/post/es423039/


All Articles