Los mensajes SMS son el método de autenticación de dos factores (2FA) más popular. Es utilizado por bancos, billeteras electrónicas y criptográficas, buzones y todo tipo de servicios;
El número de usuarios del método se acerca al 100% .
Tengo un brote de eventos es indignante, porque este método no es seguro. La reasignación del número de una tarjeta SIM a otra comenzó al comienzo de la era móvil; así es como se restaura el número cuando se pierde la SIM. Los “especialistas en destete de dinero digital” se dieron cuenta: la opción “sobrescribir tarjetas SIM” puede usarse en esquemas fraudulentos. Después de todo, quien controla la tarjeta SIM puede administrar la banca en línea, las billeteras electrónicas e incluso las criptomonedas de otras personas. Y puede hacerse cargo del número de otra persona sobornando a un empleado de telecomunicaciones mediante fraude o documentos falsos.

Se han revelado miles de episodios de intercambio de SIM: así se ha llamado a este esquema de fraude. La escala del desastre sugiere que el mundo pronto abandonará el 2FA por SMS. Pero esto no sucede: el
estudio dice que no son los usuarios los que eligen el método 2FA, sino los propietarios del servicio.
Sugerimos usar el método 2FA seguro con la entrega de códigos únicos a través de blockchain, y le diremos cómo conectarlo con el propietario del servicio.
La cuenta va a millones
En 2019, el fraude de intercambio de SIM aumentó en un 63% según la policía de Londres, y el "cheque promedio" del atacante fue de 4,000 GBP. No encontré estadísticas en Rusia, pero supongo que es aún peor.
El intercambio de SIM se usa para robar cuentas populares de Twitter, Instagram, Facebook, VK, cuentas bancarias y recientemente llegó a las criptomonedas,
informa el periódico Times del empresario de bitcoins Joby Weeks. Los casos de alto perfil de robo de criptomonedas con la ayuda del intercambio de SIM han aparecido en la prensa desde 2016; En 2019 llegó un verdadero pico.
En mayo, los fiscales estadounidenses en el distrito oriental de Michigan
acusaron a nueve jóvenes de entre 19 y 26 años: supuestamente eran miembros de una banda de hackers llamada The Community. La pandilla está acusada de siete ataques de intercambio, como resultado de lo cual los piratas informáticos se apropiaron de la criptomoneda por un valor de más de $ 2.4 millones. Y en abril, un estudiante de California, Joel Ortiz, recibió 10 años de prisión por el intercambio de SIM; $ 7,5 millones en criptomonedas se convirtieron en su presa.
Foto de Joel Ortiz en una conferencia de prensa universitaria. Dos años después, será detenido por fraude cibernético.El principio del intercambio de SIM
Intercambio significa intercambio. En todos estos esquemas, los delincuentes asignan el número de teléfono de una víctima, generalmente mediante la reemisión de una tarjeta SIM, y la usan para restablecer una contraseña. Un intercambio de SIM típico en teoría se ve así:
- Inteligencia Los estafadores descubren los datos personales de la víctima: nombre y teléfono. Se pueden encontrar en fuentes abiertas (redes sociales, amigos) o se pueden obtener de un cómplice, un empleado de un operador de telefonía móvil.
- Bloqueo La tarjeta SIM de la víctima está desactivada; Para hacer esto, simplemente llame al soporte técnico del proveedor, informe el número y diga que se ha perdido el teléfono.
- Capture, transfiera números a su tarjeta SIM. Por lo general, esto también se hace a través de un cómplice en una empresa de telecomunicaciones o falsificando documentos.
En la vida real es aún más grave. Los atacantes seleccionan a una víctima y luego controlan diariamente la ubicación del teléfono: una solicitud de información que el suscriptor ha cambiado a roaming cuesta 1-2 centavos. Tan pronto como el propietario de la tarjeta SIM se haya ido al extranjero, acuerdan con el gerente del salón de comunicación emitir una nueva tarjeta SIM. Cuesta alrededor de $ 50 (encontré información, en diferentes países y de diferentes operadores de $ 20 a $ 100), mientras que el gerente será despedido en el peor de los casos, no hay responsabilidad.
Ahora todos los intrusos recibirán todos los SMS, y el propietario del teléfono no podrá hacer nada al respecto: está en el extranjero. Y luego los villanos obtienen acceso a todas las cuentas de la víctima y, si lo desean, cambian las contraseñas.
Posibilidades de devolver bienes robados
Los bancos a veces van hacia las víctimas y retiran transferencias de sus cuentas. Por lo tanto, es posible devolver dinero fiduciario, incluso si no se encuentra al delincuente. Pero con las billeteras de criptomonedas, todo es más complicado, tanto
técnica como legalmente. Hasta ahora, ningún intercambio / billetera ha pagado una compensación a las víctimas de intercambio.
Si las víctimas quieren defender su dinero en los tribunales, acusan al operador: creó las condiciones para el robo de dinero de la cuenta. Esto es exactamente lo que hizo
Michael Turpin , quien perdió $ 224 millones debido al canje. Ahora está demandando a la compañía de telecomunicaciones AT&T.

Hasta ahora, ningún estado tiene esquemas de trabajo para proteger legalmente a los propietarios de criptomonedas. Es imposible asegurar su capital o recibir una compensación por su pérdida. Por lo tanto, prevenir un ataque de intercambio es más fácil que combatir sus consecuencias. La forma más obvia es utilizar un "segundo factor" más confiable para 2FA.
El intercambio de SIM no es el único problema de 2FA por SMS
Los códigos de confirmación en SMS también son inseguros desde un punto de vista técnico. Los mensajes pueden ser interceptados debido a vulnerabilidades fatales en el Sistema de Señalización 7 (SS7). 2FA by SMS se reconoce oficialmente como inseguro (el Instituto Nacional de Estándares y Tecnología de EE. UU. Habla de esto en su
Guía de autenticación digital ).
Además, la presencia de 2FA a menudo inspira al usuario con una sensación de falsa seguridad, y elige una contraseña más simple. Por lo tanto, dicha autenticación no complica, pero facilita el acceso de un atacante a la cuenta.
Y, a menudo, los SMS vienen con un largo retraso o no llegan en absoluto.
Otros métodos 2FA
Por supuesto, en teléfonos inteligentes y SMS, la luz no convergió. Hay otros métodos 2FA. Por ejemplo, códigos TAN únicos: el método es primitivo, pero funciona, todavía se usa en algunos bancos. Existen sistemas que utilizan datos biométricos: huellas dactilares, escaneos retinianos. Otra opción que parece un compromiso razonable en términos de conveniencia, confiabilidad y precio son las aplicaciones especiales para 2FA: RSA Token, Google Authenticator. Y hay claves físicas y otros métodos.
En teoría, todo parece lógico y confiable. Pero en la práctica, las soluciones modernas de 2FA tienen problemas y, debido a ellos, la realidad es diferente de las expectativas.
Según el
estudio , el uso de 2FA es un inconveniente en principio, y la popularidad de 2FA a través de SMS se explica por "menos inconvenientes en comparación con otros métodos": recibir códigos únicos es comprensible para el usuario.
Muchos usuarios de métodos 2FA se asocian con el temor de que se pierda el acceso. Se puede perder o robar una clave física o una lista de contraseñas de TAN. Personalmente, tengo una experiencia negativa con Google Authenticator. Se rompió mi primer teléfono inteligente con esta aplicación: evalúe mis esfuerzos para restaurar el acceso a las cuentas. Otro problema es la transición a un nuevo dispositivo. Google Authenticator no puede exportar debido a problemas de seguridad (si las claves se pueden exportar, ¿qué tipo de seguridad existe?). Una vez que transferí las claves manualmente, y luego decidí que era más fácil dejar el viejo teléfono inteligente en una caja en un estante.
El método 2FA debería ser:
- Seguro: solo usted debe obtener acceso a su cuenta, no atacantes
- Fiable: obtienes acceso a tu cuenta siempre que la necesites
- Conveniente y asequible: el uso de 2FA es claro y requiere un mínimo de tiempo
- Barato
Creemos que blockchain es la solución correcta.
Use 2FA en la cadena de bloques
Para un usuario, 2FA en la cadena de bloques se ve igual que recibir códigos únicos por SMS. La única diferencia está en el canal de entrega. La forma de obtener un código 2FA depende de lo que ofrece la cadena de bloques. En nuestro proyecto (la información está en mi perfil) esta es una aplicación web, Tor, iOS, Android, Linux, Windows, MacOS.
El servicio genera un código de una sola vez y lo envía al mensajero en la cadena de bloques. Además, según los clásicos: el usuario ingresa el código recibido en la interfaz de servicio e inicia sesión.

En el artículo
Cómo funciona un mensajero descentralizado en la cadena de bloques, escribí que la cadena de bloques garantiza la seguridad y la privacidad de la mensajería. Sobre el tema del envío de códigos 2FA, destacaré:
- Un clic para crear una cuenta, sin teléfonos ni correos electrónicos.
- Todos los mensajes con códigos 2FA están encriptados End-to-End curve25519xsalsa20poly1305.
- El ataque MITM está excluido: cada mensaje con un código 2FA es una transacción en la cadena de bloques y está firmado por Ed25519 EdDSA.
- Un mensaje con un código 2FA cae en su bloque. La secuencia y la marca de tiempo de los bloques no se pueden corregir y, por lo tanto, el orden de los mensajes.
- No existe una estructura central que verifique la "autenticidad" de un mensaje. Esto se realiza mediante un sistema de nodo distribuido basado en consenso y pertenece a los usuarios.
- Incapacidad para deshabilitar: las cuentas no se pueden bloquear y los mensajes se pueden eliminar.
- Acceda a los códigos 2FA desde cualquier dispositivo en cualquier momento.
- Mensaje de confirmación de entrega con código 2FA. Un servicio que envía una contraseña única sabe con certeza que se ha entregado. No hay botones "Enviar de nuevo".
Para comparar con otros métodos 2FA, he compilado una tabla:

El usuario recibe una cuenta en el blockchain messenger para recibir códigos en un segundo, solo se usa la frase de contraseña para ingresar. Por lo tanto, los métodos de aplicación pueden ser diferentes: puede usar una cuenta para obtener códigos para todos los servicios, o puede crear una cuenta separada para cada servicio.
También hay una desventaja: una cuenta debe tener al menos una transacción. Para que el usuario reciba un mensaje cifrado con un código, debe conocer su clave pública, y solo aparece en la cadena de bloques con la primera transacción. Salimos de esta manera: nos dieron la oportunidad de obtener tokens gratis en nuestra billetera. Sin embargo, una solución más correcta es nombrar la cuenta como clave pública. (Para comparación, nuestro número de cuenta
U1467838112172792705 es un derivado de la clave pública
cc1ca549413b942029c4742a6e6ed69767c325f8d989f7e4b71ad82a164c2ada . Para el mensajero, esto es más conveniente y legible, pero para el sistema de envío de códigos 2FA). Creo que en el futuro alguien tomará esa decisión y transferirá "Conveniencia y Accesibilidad" a la zona verde.
El costo de enviar un código 2FA es realmente bajo: 0.001 ADM, ahora es 0.00001 USD. Nuevamente, puede aumentar su blockchain y hacer que el precio sea cero.
Cómo conectar 2FA en la cadena de bloques a su servicio
Espero haber podido interesar a algunos lectores para agregar autorización de blockchain a sus servicios.
Te diré cómo hacerlo usando el ejemplo de nuestro messenger, y por analogía puedes usar otra cadena de bloques. En la aplicación de demostración 2FA, usamos postgresql10 para almacenar información de la cuenta.
Pasos de conexión:
- Cree una cuenta en la cadena de bloques desde la que enviará códigos 2FA. Recibirá una frase de contraseña, que se utiliza como clave privada para cifrar mensajes con códigos y para firmar transacciones.
- Agregue un script a su servidor para generar códigos 2FA. Si ya utiliza cualquier otro método 2FA con la entrega de contraseña de un solo uso, este paso ya se ha completado.
- Agregue un script a su servidor para enviar códigos al usuario en el blockchain messenger.
- Cree una interfaz de usuario para enviar e ingresar el código 2FA. Si ya utiliza cualquier otro método 2FA con la entrega de contraseña de un solo uso, este paso ya se ha completado.
1 Crear una cuentaCrear una cuenta en blockchain es la generación de una clave privada, una clave pública y una dirección de cuenta derivada de ella.

Primero, se genera la frase de contraseña BIP39, a partir de la cual se considera el hash SHA-256. El hash se usa para generar la clave privada ks y la clave pública kp. De la clave pública con el mismo SHA-256 con inversión, obtenemos la dirección en la cadena de bloques.
Si desea enviar códigos 2FA cada vez desde una nueva cuenta, el código para crear una cuenta deberá agregarse al servidor:
import Mnemonic from 'bitcore-mnemonic' this.passphrase = new Mnemonic(Mnemonic.Words.ENGLISH).toString() … import * as bip39 from 'bip39' import crypto from 'crypto' adamant.createPassphraseHash = function (passphrase) { const seedHex = bip39.mnemonicToSeedSync(passphrase).toString('hex') return crypto.createHash('sha256').update(seedHex, 'hex').digest() } … import sodium from 'sodium-browserify-tweetnacl' adamant.makeKeypair = function (hash) { var keypair = sodium.crypto_sign_seed_keypair(hash) return { publicKey: keypair.publicKey, privateKey: keypair.secretKey } } … import crypto from 'crypto' adamant.getAddressFromPublicKey = function (publicKey) { const publicKeyHash = crypto.createHash('sha256').update(publicKey, 'hex').digest() const temp = Buffer.alloc(8) for (var i = 0; i < 8; i++) { temp[i] = publicKeyHash[7 - i] } return 'U' + bignum.fromBuffer(temp).toString() }
En la aplicación de demostración, la simplificamos: creamos una cuenta en la aplicación web y le enviamos los códigos. En la mayoría de los casos, esto es más conveniente para el usuario: sabe que el servicio envía códigos 2FA desde una cuenta específica y puede nombrarlo.
2 Generación de códigos 2FAEl código 2FA debe generarse para cada inicio de sesión de usuario. Usamos la biblioteca
clandestina , pero puedes elegir cualquier otra.
const hotp = speakeasy.hotp({ counter, secret: account.seSecretAscii, });
Validación del código de usuario 2FA ingresado por el usuario:
se2faVerified = speakeasy.hotp.verify({ counter: this.seCounter, secret: this.seSecretAscii, token: hotp, });
3 Enviar código 2FAPuede usar la API del nodo blockchain, la biblioteca JS API o la consola para enviar el código 2FA. En este ejemplo, usamos la consola: esta es la interfaz de línea de comandos, una utilidad que simplifica la interacción con la cadena de bloques. Para enviar un mensaje con un código 2FA, debe usar el comando
send message
de la consola.
const util = require('util'); const exec = util.promisify(require('child_process').exec); … const command = `adm send message ${adamantAddress} "2FA code: ${hotp}"`; let { error, stdout, stderr } = await exec(command);
Una forma alternativa de enviar mensajes es utilizar el método de
send
en la biblioteca JS API.
4 interfaz de usuarioEl usuario debe tener la oportunidad de ingresar el código 2FA, esto se puede hacer de varias maneras dependiendo de la plataforma de su aplicación. En nuestro ejemplo, este es Vue.

El código fuente de la aplicación de demostración de autorización de dos factores en la cadena de bloques se puede ver en
GitHub . Hay un enlace en la demostración en vivo en el archivo Léame para probarlo.