SMS-meldinger er den mest populære metoden for tofaktorautentisering (2FA). Den brukes av banker, elektroniske og krypto-lommebøker, postkasser og alle slags tjenester;
Jeg er indignert over dette scenariet, fordi denne metoden er utrygg. Overføring av et nummer fra ett SIM-kort til et annet begynte i begynnelsen av mobiltiden - dette er hvordan nummeret gjenopprettes når et SIM-kort går tapt. "Digitale pengetyverispesialister" innså at alternativet "omskriv SIM-kort" kan brukes i uredelige ordninger. Tross alt kan den som kontrollerer SIM-kortet kontrollere andres nettbank, elektroniske lommebøker og til og med kryptovaluta. Og du kan ta en annen persons nummer i besittelse ved å bestikke en telekomansatt, bruke bedrag eller forfalskede dokumenter.
Tusenvis av episoder med SIM-bytte har blitt avdekket, som denne svindelordningen kalles. Omfanget av katastrofen antyder at verden snart vil forlate 2FA via SMS. Men dette skjer ikke - i
Vi foreslår å bruke den sikre 2FA-metoden med levering av engangskoder via blokkjeden, og vi vil fortelle deg hvordan tjenesteeieren kan koble den til.
Antallet går i millioner
I 2019 økte svindel med SIM-bytte med 63 % ifølge London-politiet, og "gjennomsnittsregningen" til en angriper var 4,000 GBP. Jeg har ikke funnet noen statistikk i Russland, men jeg antar at de er enda verre.
SIM-bytte brukes til å stjele populære Twitter-, Instagram-, Facebook-, VK-kontoer, bankkontoer og nylig til og med kryptovalutaer -
I mai, det amerikanske advokatkontoret for det østlige distriktet i Michigan
Bilde av Joel Ortiz på en pressekonferanse ved universitetet. To år senere vil han bli varetektsfengslet for nettsvindel.
Hvordan SIM-bytte fungerer
"Swap" betyr bytte. I alle slike ordninger tar kriminelle over offerets telefonnummer, vanligvis ved å utstede et SIM-kort på nytt, og bruker det til å tilbakestille passordet. En typisk SIM-bytte ser i teorien slik ut:
- Etterretningstjeneste. Svindlere finner ut offerets personlige opplysninger: navn og telefonnummer. De kan finnes i åpne kilder (sosiale nettverk, venner) eller mottas fra en medskyldig - en ansatt hos en mobiloperatør.
- Blokkering. Offerets SIM-kort er deaktivert; For å gjøre dette, ring bare leverandørens tekniske støtte, oppgi nummeret og si at telefonen var tapt.
- Ta opp, overfør nummeret til SIM-kortet ditt. Vanligvis gjøres dette også gjennom en medskyldig i teleselskapet eller gjennom dokumentforfalskning.
I det virkelige liv er ting enda mer alvorlig. Angripere velger et offer og sporer deretter plasseringen til telefonen daglig – én forespørsel om å motta informasjon om at abonnenten har gått over til roaming koster 1-2 cent. Så snart eieren av SIM-kortet har reist til utlandet, forhandler de med lederen i kommunikasjonsbutikken om å utstede et nytt SIM-kort. Det koster ca $50 (jeg fant informasjon - i forskjellige land og med forskjellige operatører fra $20 til $100), og i verste fall vil manageren få sparken - det er ikke noe ansvar for dette.
Nå vil all SMS mottas av angripere, og eieren av telefonen vil ikke kunne gjøre noe med det - han er i utlandet. Og så får skurkene tilgang til alle offerets kontoer og endrer passord hvis ønskelig.
Sjanser for å returnere stjålet eiendom
Banker tar noen ganger imot ofre halvveis og trekker overføringer fra kontoene deres. Derfor er det mulig å returnere fiat-penger selv om forbryteren ikke blir funnet. Men med cryptocurrency-lommebøker er alt mer komplisert - og teknisk sett, og lovmessig. Så langt har ikke en eneste børs/lommebok betalt erstatning til ofre for bytte.
Hvis ofre ønsker å forsvare pengene sine i retten, skylder de på operatøren: han skapte betingelsene for tyveri av penger fra kontoen. Det var akkurat det jeg gjorde
Så langt har ingen stat fungerende ordninger for å lovlig beskytte eiere av kryptovaluta. Det er umulig å forsikre kapitalen din eller få erstatning for tapet. Derfor er det enklere å forhindre et bytteangrep enn å håndtere konsekvensene. Den mest åpenbare måten er å bruke en mer pålitelig "andre faktor" for 2FA.
SIM-bytte er ikke det eneste problemet med 2FA via SMS
Bekreftelseskoder i SMS er også utrygge fra et teknisk synspunkt. Meldinger kan bli fanget opp på grunn av uopprettede sårbarheter i Signaling System 7 (SS7). 2FA over SMS er offisielt anerkjent som usikker (US National Institute of Standards and Technology sier dette i sin
Samtidig gir tilstedeværelsen av 2FA ofte brukeren en følelse av falsk sikkerhet, og han velger et enklere passord. Derfor gjør slik autentisering det ikke vanskelig, men gjør det lettere for en angriper å få tilgang til kontoen.
Og ofte kommer SMS med lang forsinkelse eller kommer ikke i det hele tatt.
Andre 2FA-metoder
Selvfølgelig konvergerte ikke lyset på smarttelefoner og SMS. Det finnes andre metoder for 2FA. For eksempel engangs TAN-koder: en primitiv metode, men den fungerer - den brukes fortsatt i noen banker. Det er systemer som bruker biometriske data: fingeravtrykk, netthinneskanning. Et annet alternativ som virker som et rimelig kompromiss når det gjelder bekvemmelighet, pålitelighet og pris er spesialapplikasjoner for 2FA: RSA Token, Google Authenticator. Det finnes også fysiske nøkler og andre metoder.
I teorien ser alt logisk og pålitelig ut. Men i praksis har moderne 2FA-løsninger problemer, og på grunn av dem skiller virkeligheten seg fra forventningene.
Ifølge
Brukere forbinder mange 2FA-metoder med frykten for at tilgangen går tapt. Den fysiske nøkkelen eller listen over TAN-passord kan gå tapt eller stjeles. Jeg personlig har hatt dårlige erfaringer med Google Authenticator. Min første smarttelefon med denne applikasjonen gikk i stykker - setter pris på innsatsen min for å gjenopprette tilgangen til kontoene mine. Et annet problem er å bytte til en ny enhet. Google Authenticator har ikke et eksportalternativ på grunn av sikkerhetsårsaker (hvis nøkler kan eksporteres, hvilken sikkerhet er det?). En gang bar jeg nøklene manuelt, og da bestemte jeg meg for at det var lettere å la den gamle smarttelefonen ligge i en boks på en hylle.
2FA-metoden bør være:
- Sikkert – bare du og ikke angripere skal få tilgang til kontoen din
- Pålitelig – du får tilgang til kontoen din når du trenger det
- Praktisk og tilgjengelig - bruk av 2FA er oversiktlig og tar minimalt med tid
- Billig
Vi tror at blockchain er den rette løsningen.
Bruk 2FA på blokkjeden
For brukeren ser 2FA på blokkjeden ut som å motta engangskoder via SMS. Den eneste forskjellen er leveringskanalen. Metoden for å få en 2FA-kode avhenger av hva blokkjeden tilbyr. I prosjektet vårt (informasjon er i profilen min) er dette en nettapplikasjon, Tor, iOS, Android, Linux, Windows, MacOS.
Tjenesten genererer en engangskode og sender den til messengeren på blokkjeden. Følg deretter klassikerne: brukeren skriver inn den mottatte koden i tjenestegrensesnittet og logger på.
Artikkelen
- Ett klikk for å opprette en konto - ingen telefoner eller e-poster.
- Alle meldinger med 2FA-koder er kryptert End-to-End curve25519xsalsa20poly1305.
- MITM-angrep er ekskludert - hver melding med 2FA-koden er en transaksjon på blokkjeden og er signert av Ed25519 EdDSA.
- Meldingen med 2FA-koden havner i sin egen blokk. Sekvensen og tidsstemplingen til blokker kan ikke korrigeres, og derfor rekkefølgen på meldinger.
- Det er ingen sentral struktur som kontrollerer "ektheten" til en melding. Dette gjøres av et distribuert system av noder basert på konsensus, og det eies av brukerne.
- Kan ikke deaktiveres - kontoer kan ikke blokkeres og meldinger kan ikke slettes.
- Få tilgang til 2FA-koder fra hvilken som helst enhet når som helst.
- Bekreftelse på meldingslevering med 2FA-kode. Tjenesten som sender engangspassordet vet med sikkerhet at det er levert. Ingen "Send igjen"-knapper.
For å sammenligne med noen andre 2FA-metoder laget jeg en tabell:
Brukeren mottar en konto i blockchain-messengeren for å motta koder på et sekund - kun en passordfrase brukes til å logge på. Derfor kan applikasjonsmetodene være forskjellige: du kan bruke én konto for å motta koder for alle tjenester, eller du kan opprette en egen konto for hver tjeneste.
Det er også en ulempe - kontoen må ha minst én transaksjon. For at brukeren skal motta en kryptert melding med en kode, må du kjenne den offentlige nøkkelen hans, og den vises i blokkjeden bare med den første transaksjonen. Slik klarte vi å komme oss ut av det: Vi ga dem muligheten til å motta gratis tokens i lommeboken. En bedre løsning er imidlertid å gi kontoen navnet en offentlig nøkkel. (Til sammenligning har vi et kontonummer U1467838112172792705 er et derivat av den offentlige nøkkelen cc1ca549413b942029c4742a6e6ed69767c325f8d989f7e4b71ad82a164c2ada. For messenger er dette mer praktisk og lesbart, men for systemet for å sende 2FA-koder er det en begrensning). Jeg tror at noen i fremtiden vil ta en slik beslutning og flytte "Bekvemmelighet og tilgjengelighet" til den grønne sonen.
Prisen for å sende en 2FA-kode er veldig lav - 0.001 ADM, nå er den 0.00001 USD. Igjen kan du heve blokkjeden din og gjøre prisen null.
Hvordan koble 2FA på blokkjeden til tjenesten din
Jeg håper jeg var i stand til å interessere noen få lesere til å legge til blokkjedeautorisasjon til tjenestene deres.
Jeg vil fortelle deg hvordan du gjør dette ved å bruke vår messenger som et eksempel, og analogt kan du bruke en annen blokkjede. I 2FA-demo-appen bruker vi postgresql10 til å lagre kontoinformasjon.
Tilkoblingsstadier:
- Opprett en konto på blokkjeden som du vil sende 2FA-koder fra. Du vil motta en passordfrase, som brukes som en privat nøkkel for å kryptere meldinger med koder og for å signere transaksjoner.
- Legg til et skript på serveren din for å generere 2FA-koder. Hvis du allerede bruker en annen 2FA-metode med engangspassordlevering, har du allerede fullført dette trinnet.
- Legg til et skript på serveren din for å sende koder til brukeren i blockchain-messengeren.
- Lag et brukergrensesnitt for å sende og legge inn en 2FA-kode. Hvis du allerede bruker en annen 2FA-metode med engangspassordlevering, har du allerede fullført dette trinnet.
1 Kontoopprettelse
Å opprette en konto i blokkjeden betyr å generere en privat nøkkel, en offentlig nøkkel og en avledet kontoadresse.
Først genereres BIP39-passordet, og SHA-256-hashen beregnes ut fra det. Hashen brukes til å generere den private nøkkelen ks og den offentlige nøkkelen kp. Fra den offentlige nøkkelen, ved å bruke samme SHA-256 med inversjon, får vi adressen i blokkjeden.
Hvis du vil sende 2FA-koder hver gang fra en ny konto, må kontoopprettingskoden legges til serveren:
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()
}
I demoapplikasjonen forenklet vi det - vi opprettet én konto i webapplikasjonen, og sender koder fra den. I de fleste tilfeller er dette også mer praktisk for brukeren: han vet at tjenesten sender 2FA-koder fra en spesifikk konto og kan navngi den.
2 Generering av 2FA-koder
En 2FA-kode må genereres for hver brukerpålogging. Vi bruker biblioteket
const hotp = speakeasy.hotp({
counter,
secret: account.seSecretAscii,
});
Kontrollerer gyldigheten av 2FA-koden som er angitt av brukeren:
se2faVerified = speakeasy.hotp.verify({
counter: this.seCounter,
secret: this.seSecretAscii,
token: hotp,
});
3 Sender 2FA-kode
For å sende inn en 2FA-kode kan du bruke blockchain node API, JS API-biblioteket eller konsollen. I dette eksemplet bruker vi konsollen - dette er kommandolinjegrensesnittet, et verktøy som forenkler interaksjon med blokkjeden. For å sende en melding med en 2FA-kode, må du bruke kommandoen send message
konsoller.
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);
En alternativ måte å sende meldinger på er å bruke metoden send
i JS API-biblioteket.
4 Brukergrensesnitt
Brukeren må få muligheten til å legge inn en 2FA-kode, dette kan gjøres på forskjellige måter avhengig av applikasjonsplattformen din. I vårt eksempel er dette Vue.
Kildekoden for blockchain to-faktor autentisering demo-applikasjonen kan sees på
Kilde: www.habr.com