Acabo de crear Webkey en los últimos días. Está diseñado para realizar la autenticación de certificado de cliente sin utilizar la funcionalidad de certificado de cliente (en mi opinión, inutilizable) integrada en los navegadores. Permitiría la autenticación de una sola contraseña como lo hace una clave ssh, pero para la web.
La contraseña del usuario nunca se envía a través de Internet (incluso en forma cifrada). Esta utilidad se puede alojar de forma completamente estática (y actualmente se hospeda en enlace ).
La aplicación solicitante carga webkey en un iframe sobre https. A petición de autenticación, si el usuario no ha creado un par de claves RSA, webkey hace eso en el iframe y lo guarda en el almacenamiento local (cifrado con aes usando una contraseña que el usuario crea). El usuario también guarda un correo electrónico para utilizarlo como su ID.
Estos son los pasos de autenticación en más detalle desde la perspectiva de la aplicación que solicita autenticación:
- En el cliente, solicite la aceptación del usuario (comando requestAcceptance) y envíe el correo electrónico y la clave pública resultantes al servidor
- En el servidor , si ese correo electrónico aún no está en el sistema con esa clave pública, envíeles un correo electrónico de verificación (si lo desea) y, una vez verificado, asocie el correo electrónico y la clave pública a su Base de datos y salta al paso 7 Si ese correo electrónico está en el sistema con esa clave pública, continúe con el paso 3
- En el servidor , genere un token de 3-20 caracteres (en forma de cadena) y envíelo al cliente
- En el cliente, envíe el token al iframe de webkey usando el comando 'auth' postMessage
- En el cliente, reciba el token firmado (llamado la prueba) de webkey y envíe esa prueba al servidor.
- En el servidor , verifique que el token con la clave pública dada (el servidor aún debe tener el token original, NO confíe en ningún token enviado por el cliente al servidor)
- Beneficio! ¡Su usuario ahora está autenticado!
¿Lo que estoy haciendo aquí es teóricamente seguro? ¿Cuáles son los problemas potenciales con cómo funciona esto?