¿Es LocalCryptos Descentralizada?
10 minutos
Una de las principales diferencias entre LocalCryptos y otras plataformas peer-to-peer es que LocalCryptos está blindada por tecnología descentralizada.
LocalCryptos es descentralizada en el aspecto más importante — no podemos ver tus claves privadas, no tenemos acceso a tus monedas, no podemos leer tus mensajes sin tu consentimiento, y no tenemos el poder de retirar los fondos depositados en los contratos de garantía. Adicionalmente, todas las operaciones son peer-to-peer (entre personas) y las transferencias se realizan por fuera de la plataforma mediante procesadores de pagos externos, por lo que no se está confiando ni las criptomonedas ni el dinero tradicional a LocalCryptos.
Pero como con todo lo que utilizas online, LocalCryptos no es un sistema completamente descentralizado. Está hecho de una mezcla de elementos tanto centralizados como descentralizados para lograr un equilibrio entre una seguridad sólida y usabilidad. La plataforma es centralizada en el mismo modo que aquellas aplicaciones cifradas en ambos extremos como Signal, Telegram, Wickr, Viber, y WhatsApp, cada una dependiendo de servidores centralizados para entregar código, transportar y almacenar cargas útiles (payloads) cifradas, y realizar tareas de mantenimiento que serían inviables o innecesarias de ejecutar de forma autocustodial o encriptada.
A diferencia de la mayoria de sitios web en la Internet, muchas operaciones importantes se ejecutan desde tu navegador en lugar de nuestros servidores. No obstante, tenemos servidores responsables de ciertas tareas — aunque tratamos de mantener sus roles al margen tanto como nos sea posible con la tecnología actualmente disponible.
En este sentido, tomamos la decisión de evitar un sistema totalmente descentralizado en pro de cumplir con los requisitos importantes de diseño que nos hemos trazado. Esto significa, principalmente, hacer que el producto esté disponible para todos sin importar su nivel de conocimiento y experiencia con criptografía y criptomonedas.
A modo de resumen, los siguientes componentes de LocalCryptos pueden ser calificados como descentralizados o centralizados:
- Carteras: Descentralizado — Las claves privadas de tu cartera son generadas por tu dispositivo y jamás pueden ser vistas por nuestros servidores. Tu cartera web de LocalCryptos es una billetera autocustodial.
- Contrato de garantía: Descentralizado — Las transacciones P2P son aseguradas utilizando contratos de garantía sin custodia, basados en tecnología blockchain. LocalCryptos no tiene el poder de sacar los fondos de dichos contratos.
- Mensajes de usuarios: Cifrados en ambos extremos — Los mensajes entre usuarios están cifrados en ambos extremos. LocalCryptos no puede leer tu historial de mensajes sin tu consentimiento.
- Pagos: Por fuera de la plataforma — En las transacciones peer-to-peer, los pagos se realizan usando servicios financieros externos, ajenos al ecosistema de la plataforma.
- Reputación: Centralizado — La reputación de un usuario, como las calificaciones recibidas y el volumen de operaciones, se mantiene en una base de datos centralizada manejada por LocalCryptos.
- Ofertas: Centralizado — Los usuarios publican sus ofertas en un directorio mantenido por LocalCryptos, y nuestros servidores hacen que la búsqueda y clasificación sean rápidas y sencillas.
- Metadatos del intercambio: Centralizado — Aunque los mensajes y las transferencias de un intercambio involucran criptografía y carteras autocustodiales, varias propiedades de los metadatos no son encriptados. Por ejemplo, los montos, códigos de divisas, y direcciones públicas, son almacenados en una base de datos centralizada.
- Notificaciones: Centralizado — Las notificaciones por email, SMS, y demás, son distribuidas por los servidores que LocalCryptos mantiene. Para que esto funcione, necesitamos almacenar cierta información personal, del mismo modo que lo haría cualquier otro sitio web. Puedes leer sobre cómo utilizamos y manejamos tu información en nuestra Política de Privacidad.
Criptografía en tu navegador
LocalCryptos fue desarrollado utilizando la relativamente moderna Web Cryptography API (o API de criptografía web), la cual permite realizar operaciones criptográficas, como cifrado y descifrado, desde una aplicación web. Desde el 2022, la criptografía web es soportada por las últimas versiones de todos los navegadores web principales, tanto de escritorio como móviles.
LocalCryptos es una de las pocas aplicaciones web conocidas que ha tomado plena ventaja de la nueva API de criptografía web para construir una nueva categoría de sitios web respaldados por criptografía. Otros ejemplos incluyen a WhatsApp Web, el servicio de mensajería cifrada en ambos extremos, y Skiff, un editor de documentos colaborativo encriptado.
La aplicación web de LocalCryptos utiliza la criptografía de distintas formas para blindar la información, y para habilitar la mensajería encriptada. Nuestra meta siempre ha sido permitir a los usuarios conservar el control total sobre los aspectos más importantes de sus cuentas, al tiempo que sólo revelan una mínima cantidad de metadatos a los servidores de LocalCryptos.
Cada una de las técnicas usadas por LocalCryptos se inspiraron en sistemas de renombre como el protocolo de mensajería Off-the-Record (OTR), el protocolo Signal de Open Whisper System, y la cartera web cifrada de Blockchain.info. Dichos sistemas son ampliamente utilizados y han sido revisados por criptógrafos y desarrolladores de gran categoría.
Cómo funcionan las contraseñas de las cuentas
Puedes conectarte a tu cuenta con un usuario y una contraseña. Aunque el proceso de inicio de sesión se ve y se siente igual al de cualquier otro sitio web, bajo el capó se están ejecutando procesos criptográficos complejos. La contraseña que usas es, de hecho, una frase de acceso criptográfica que nunca se va de tu dispositivo.
Dicha contraseña, que seleccionaste cuando creaste tu cuenta por primera vez, se convirtió en una clave criptográfica utilizando un proceso de elongación de claves conocido como PBKDF2. Luego, tu "clave maestra" — que básicamente permite desbloquear tu cuenta — fue encriptada utilizando dicha frase de acceso elongada.
Entonces, cuando inicias sesión, tu contraseña es sometida al mismo proceso de elongación de claves de cuando creaste tu cuenta, y es utilizada para intentar descifrar tu "clave maestra". Es la titularidad de la clave maestra la que te permite descifrar otras claves, como las claves privadas de tu cartera o las claves que se utilizan para cifrar mensajes con otros usuarios.
El motivo por el que todo lo que es importante se encripta con esta "clave maestra", en lugar de encriptarlo todo con tu contraseña directamente, es para que esta última pueda ser cambiada después. El cambio de contraseña implica simplemente volver a cifrar la clave maestra con una nueva frase de acceso (en lugar de la otra alternativa, que implicaría volver a cifrar absolutamente todo).
Con más detalle
Creando una cuenta
Cuando un usuario crea una cuenta en LocalCryptos, se genera una clave criptográfica — conocida como "clave maestra" — en el dispositivo de dicho usuario. Esta "clave maestra" es utilizada después para derivar otras claves — como por ejemplo, una clave para cifrar otras claves privadas para almacenar criptomonedas, o una clave para firmar información.
Al momento de crear una cuenta, el primer paso es generar una "clave maestra" aleatoria de 32 bytes (AccountKeyMaster
) con la ayuda de la API de criptografía web.
Una vez que la AccountKeyMaster
es creada, se puede derivar dos claves más de ella:
AccountKeyIdentityPrivate
es la función de SHA256(AccountKeyMaster, "identity")
. La misma se utilizará para firmar mensajes digitalmente utilizando criptografía de curva elíptica.AccountKeyEnc
es la función de SHA256(AccountKeyMaster, "enc")
. Esta clave se usará para encriptar otras claves mediante cifrado simétrico AES.
La clave AccountKeyMaster
debe ser encriptada utilizando la contraseña introducida por el usuario. Sin embargo, la contraseña por sí sola no será suficiente: debe ser transformada primero en una clave segura adecuada para el cifrado, utilizando la función de derivación de clave PBKDF2. Este proceso, conocido como "key stretching" (elongación de clave), agrega un trabajo computacional complejo que vuelve a la contraseña muy difícil de crackear. La Passphrase
(que vendría a ser la contraseña) se estira empleando el método PBKDF2, que utiliza al menos 100.000 iteraciones con la sal PassphraseSalt
para crear una clave secreta SecretKey
.
Una vez que la SecretKey
es derivada, la AccountKeyMaster
es cifrada utilizándola con AES-256-CBC. El vector de inicialización (16 bytes aleatorios) se conserva como SecretIv
.
Antes de que el proceso de registro de una cuenta se complete, LocalCryptos requiere que se firme un mensaje único para probar que conoces la clave privada. El navegador necesita obtener el mensaje único que debe ser firmado desde la API de LocalCryptos. Esto se conoce como un "token" de registro efímero, y contiene:
TokenId
— Un identificador único para el token de registro.TokenNonce
— El mensaje que se debe firmar con el nuevo par de claves que estás por crear.
Una vez obtenido, se crea una firma digital del token de registro utilizando la clave AccountKeyIdentityPrivate
. TokenSignature
es una ifrma ECDSA del hash Keccak-256 del TokenNonce
.
Luego, la información no confidencial es enviada a la API y se crea una nueva cuenta de LocalCryptos. (Todo lo que está marcado como "secreto" a continuación no es enviado.)
Passphrase
(secreto) — Contraseña introducida por el usuario.SecretKey
(secreto) — Una clave de 32 bytes más segura, derivada de la elongación de Passphrase
usando PBKDF2 con la sal PassphraseSalt
utilizando al menos 100.000 iteraciones.AccountKeyMaster
(secreto) — una clave maestra de cuenta de 32 bytes generada aleatoriamente. Este es el elemento raíz de donde deriva todo en tu cuenta; es crucial mantener esto a salvo.AccountKeyIdentityPrivate
(secreto) — Una clave que es el hash SHA-256 de la concatenación de AccountKeyMaster
y "identity" (identidad). Utilizada para firmar y autenticar.AccountKeyEnc
(secreto) — Una clave que es el hash SHA-256 de la concatenación de AccountKeyMaster
y "enc" (encriptación). Utilizada para el cifrado.AccountKeyIdentityPublic
— Usando la curva secp256k1, una clave pública ECDSA que corresponde a la AccountKeyIdentityPrivate
. La unicidad se impone aquí; dos usuarios no pueden tener la misma AccountKeyIdentityPublic
.PassphraseSalt
— La "sal", o conjunto de bits aleatorios de 16 bytes utilizados para el proceso PBKDF2.PassphrasePBKDF2Iterations
— El número de iteraciones PBKDF2 utilizados para estirar la Passphrase
a una forma de clave más segura. Entre más alto el número, más lento el proceso de elongación de clave y por tanto, más resistente a los ataques de fuerza bruta.SecretIv
— El vector de inicialización de 16 bytes generado aleatoriamente, utilizado para cifrar la AccountKeyMaster
.SecretCiphertext
— El texto cifrado de AccountKeyMaster
encriptado en la SecretKey
mediante AES-256-CBC.TokenSignature
— Una firma digital del hash Keccak-256 del TokenNonce
por la AccountKeyIdentityPrivate
, para verificar la titularidad de la AccountKeyIdentityPublic
.- Cualquier otra información de la cuenta (p. ej. usuario y correo electrónico).
Conectándose a una cuenta
Conectarse a una cuenta requiere un segundo factor de autenticación. Por defecto, este factor es el correo electrónico, y existe soporte opcional para contraseñas de un solo uso (One-Time Password, o OTP) sincronizadas por tiempo — por ejemplo, de aplicaciones como Google Authenticator. Los SMS no son utilizados como segundo factor porque no son seguros.
También conocida como autenticación de dos factores, esta es necesaria para proteger la versión cifrada de AccountKeyMaster
(p. ej. SecretCiphertext
y SecretIv
). Aunque el proceso de descifrado ha sido ralentizado por el proceso de elongación de clave, en teoría, las contraseñas siguen siendo susceptibles a ataques de fuerza bruta (especialmente los ataques de diccionario en contraseñas extremadamente débiles). Esconder la clave detrás de un método de dos factores elimina virtualmente el hipotético vector de ataque de otro usuario obteniendo tu contraseña por fuerza bruta.
La autenticación de este segundo factor es ejecutado por la API, lo que significa que hay un minúsculo grado de confianza aquí. Si la base de datos fuera hackeada, un atacante podría obtener todas las claves privadas encriptadas. Aún así, estas contraseñas están saladas y estiradas de manera tal que los ataques de tablas arcoiris no son viables, y otros ataques de fuerza bruta son muy dificiles de ejecutar. En este hipotético escenario sería muy difícil para el hacker obtener las contraseñas, a excepción de aquellas que fuesen muy débiles (p. ej. "contraseña", o una contraseña reutilizada de una base de datos ajena previamente comprometida).
Este es el proceso de conexión para autenticación de dos factores por correo electrónico:
- El usuario ingresa su usuario y contraseña.
- El usuario es enviado a la API en una solicitud para obtener la clave privada cifrada que está asociada al mismo. La contraseña es ignorada por ahora.
- Se envía un correo a la dirección e-mail asociada al usuario, contentivo de un enlace seguro para proseguir con la solicitud de inicio de sesión.
- Una vez que se hace clic en dicho enlace, la ventana original de conexión recibe los
SecretCiphertext
, SecretIv
, PassphraseSalt
, y PassphrasePBKDF2Iterations
. - The user‐entered password is salted and stretched as required to derive
SecretKey
. The stretching process must be exactly the same as the process used when signing up. - If the
SecretKey
can be used to calculate AccountKeyMaster
correctly and hence AccountKeyIdentityPublic
, then the login attempt was successful. If not, the user is prompted to try another password and step 5 is repeated. - A nonce provided by the API is signed by
AccountKeyIdentityPrivate
to prove ownership of the key pair, and a new session is issued. AccountKeyMaster
is stored in the browser's storage for the duration of the session.
Changing your password
Changing an account password involves re-encrypting AccountKeyMaster
with a new SecretKey
. The AccountKeyMaster
key can never be changed, hence neither can the identity key or account encryption key be changed.
Known caveats
There are some known limitations of our implementation to keep in mind.
- Brute-force attacks — Brute‐force attacks are very difficult because of the key stretching process, but the threat shouldn't be ignored. No matter how large the warnings are, some users are still going to use weak or reused passwords. As further protection, two-factor authentication is mandatory before the log-in process.
- Two-factor confusion — The fact that second-factor authentication comes before attempting the password is opposite to nearly every other website out there. This inevitably causes some confusion to users.
- Lost passwords — If you lose your password, there is no way for staff to manually recover access to an account. It's the same as losing the private key to a cryptocurrency wallet. There is nothing we can do to allow you to regain access to an account without the password. Consequently, if you had any cryptocurrency stored in the web wallet attached to your account, we cannot recover it. This is why LocalCryptos strongly recommends to back up your wallet.
- No recovery from break-ins — Changing the account password after a break‐in has essentially no effect; the account is forever compromised as the master key cannot change. If an account is stolen, the victim must make a new account and start over.
Author
Michael is the co-founder and technical lead of LocalCryptos, the largest non-custodial peer-to-peer digital currency marketplace. Peer-to-peer traders use LocalCryptos to buy and sell crypto using non-custodial wallets and a secure decentralized escrow system.
Australia