Kuinka aikaperusteiset kertasanat toimivat ja miksi sinun pitäisi käyttää niitä sovelluksessasi.

Kuva William Iven on Unsplash

Kyberturvallisuusuhkien lisääntyessä on tullut yhä tarpeellisemmaksi päivittää verkkosovellustesi turvallisuusstandardeja. Sinun on varmistettava, että käyttäjien tilit ovat turvassa.

Nykyään monet online-verkkosovellukset pyytävät käyttäjiä lisäämään tililleen ylimääräisen suojauskerroksen. He tekevät sen mahdollistamalla 2-tekijän todennuksen. 2-tekijän todennuksen toteuttamiseksi on olemassa erilaisia ​​menetelmiä, ja TOTP (Time-based One-Time Password algorithm) -autentikointi on yksi niistä.

Tämä artikkeli selittää mitä se on, miten ja miksi sitä käytetään. Mutta ennen kuin ymmärrät sen, katsotaanpa ensin lyhyesti sitä, mitä kaksifaktorinen todennus tarkoittaa.

Mikä on kaksifaktorinen todennus?

Kaksikerroinen todennus (tai monitekijäinen todennus) on vain ylimääräinen suojaustaso käyttäjän tilille. Tämä tarkoittaa, että kahden tekijän todennuksen käyttöönoton jälkeen käyttäjän on suoritettava vielä yksi vaihe kirjautuakseen onnistuneesti sisään. Esimerkiksi tiliin kirjautumisen tavalliset vaiheet ovat:

Mutta sen jälkeen kun 2-tekijäinen todennus on otettu käyttöön, vaiheet näyttävät noin:

Joten tämä lisää yhden askeleen sisäänkirjautumisprosessiin. Tämä menetelmä on turvallisempi, koska rikollinen ei voi käyttää käyttäjän tiliä, ellei hänellä ole pääsyä käyttäjän käyttäjän tavalliseen salasanaan ja kertaluonteiseen salasanaan.

Tällä hetkellä on olemassa kaksi laajalti käytettyä tapaa kerätä salasana:

  1. SMS-pohjainen: Tässä menetelmässä joka kerta kun käyttäjä kirjautuu sisään, hän vastaanottaa tekstiviestin rekisteröidylle puhelinnumerolleen, joka sisältää kertaluonteisen salasanan.
  2. TOTP-pohjainen: Vaikka tässä menetelmässä sallitaan kaksifaktorinen todennus, käyttäjää pyydetään skannaamaan QR-kuva tietyllä älypuhelinsovelluksella.
    Sovellus luo sitten jatkuvasti kertaluonteisen salasanan käyttäjälle.

SMS-pohjainen menetelmä ei tarvitse selitystä. Se on helppoa, mutta sillä on omat ongelmansa, kuten tekstiviestien odottaminen jokaisessa kirjautumisyrityksessä, tietoturvaongelmat jne. TOTP-pohjainen menetelmä on tulossa suosituksi, koska sillä on etuja SMS-pohjaiseen menetelmään verrattuna. Joten ymmärretään miten TOTP-pohjainen menetelmä toimii.

Kuinka TOTP-pohjainen menetelmä toimii

Ennen kuin ymmärrät tämän, keskustelemme ensin, mitä ongelmia tämä menetelmä ratkaisee meille.

TOTP-menetelmää käyttämällä luomme älypuhelinsovelluksen kautta käyttäjän salasanaan (palvelinpuolen sijasta) kertaluonteisen salasanan.

Tämä tarkoittaa, että käyttäjillä on aina pääsy kertaluonteiseen salasanaansa. Se estää palvelinta lähettämästä tekstiviestiä joka kerta, kun käyttäjä yrittää kirjautua sisään.

Luotu salasana vaihtuu myös tietyn ajan kuluttua, joten se käyttäytyy kuin yhden kerran salasana.

Loistava! Ymmärretään nyt TOTP-menetelmän toiminta ja yritetään toteuttaa yllä oleva ratkaisu itse. Vaatimuksemme on luoda salasana käyttäjän puolelle, ja salasanan tulisi jatkuvasti muuttua.

Seuraavat voivat olla tapa toteuttaa tämä ratkaisu:

Kun käyttäjä sallii kahden tekijän todennuksen:
1. Taustaohjelma luo salaisen avaimen kyseiselle käyttäjälle.
2. Palvelin jakaa tämän salaisen avaimen käyttäjän puhelimesovelluksen kanssa.
3. Puhelinsovellus alustaa laskurin.
4. Puhelinsovellus luo kertaluonteisen salasanan kyseistä salaista avainta ja laskuria käyttämällä.
5. Puhelinsovellus muuttaa laskuria tietyn ajan kuluttua ja palauttaa kerta-salasanan tekemällä siitä dynaamisen.

Tämän pitäisi toimia, mutta siihen liittyy kolme pääongelmaa:

  1. Kuinka sovellus luo kertaluonteisen salasanan salaista avainta ja laskuria käyttämällä?
  2. Kuinka laskuri päivittyy? Kuinka verkkopalvelin seuraa laskuria?
  3. Kuinka palvelin jakaa salaisen avaimen puhelimen sovelluksen kanssa?

Ratkaisu ensimmäiseen ongelmaan on määritelty HOTP-algoritmissa.

HOTP: n ymmärtäminen:

HOTP tarkoittaa "HMAC-pohjaista kertaluonteista salasanaa". Internet-tekniikan työryhmä (IETF) julkaisi tämän algoritmin nimellä RFC4226. HOTP määrittelee algoritmin luomaan kertaluonteisen salasanan salaisesta avaimesta ja laskurista.

Voit käyttää tätä algoritmia kahdessa vaiheessa:

  1. Ensimmäinen vaihe on luoda HMAC-hash salaisesta avaimesta ja laskurista.
// Hanki HMAC-tiiviste (käyttämällä SHA-1-hajautusalgoritmia) secretKey: llä ja laskurilla
hmacHash = HMAC-SHA-1 (secretKey, laskuri);

2. Tässä koodissa lähtö olisi 20 tavun pituinen merkkijono. Tämä pitkä merkkijono ei sovellu kerta-salasanana. Joten me tarvitsemme tavan katkaista kyseinen merkkijono. HOTP määrittelee tavan katkaista kyseinen naru haluttuun pituuteen.

// hmacHash [19] tarkoittaa merkkijonon 19. tavua.
offset = hmacHash [19] & 0xf;
truncatedHash =
 (hmacHash [offset ++] & 0x7f) << 24 |
 (hmacHash [offset ++] & 0xff) << 16 |
 (hmacHash [offset ++] & 0xff) << 8 |
 (hmacHashh [offset ++] & 0xff);
finalOTP = (katkaistuHash% (10 ^ numeroOfDigitsRequiredInOTP));

Se voi näyttää pelottavalta, mutta ei ole. Tässä algoritmissa saadaan ensin siirto, joka on hmacHashin viimeiset 4 bittiä [19]. Sen jälkeen yhdistämme tavut hmacHashista [offset] arvoon hmacHash [offset + 3] ja tallennamme viimeiset 31 bittiä typistettyynHashiin. Lopuksi, käyttämällä yksinkertaista modulo-operaatiota, saamme kohtuullisen pitkäaikaisen salasanan.

Tämä määrittelee melko paljon HOTP-algoritmin. RFA4226-dokumentti selittää, miksi tämä on turvallisin tapa hankkia kertasanalasana näistä kahdesta arvosta.

Loistava! Joten olemme löytäneet tavan hankkia kertaluonteinen salasana salaisen avaimen ja laskurin avulla. Entä toinen ongelma? Kuinka seurata tiskiä?

Ratkaisu toiseen ongelmaan löytyy TOTP: stä.

TOTP: n ymmärtäminen:

TOTP tarkoittaa "aikaperusteista kertaluonteista salasanaa". IETF on julkaissut tämän nimellä RFC6238.

TOTP käyttää HOTP-algoritmia kerta-salasanan hankkimiseen. Ainoa ero on, että siinä käytetään ”aikaa” ”laskurin” sijasta ja se tarjoaa ratkaisun toiseen ongelmaamme.

Tämä tarkoittaa, että laskurin alustamisen ja sen seurannan sijasta voimme käyttää aikaa laskurina HOTP-algoritmissa OTP: n saamiseksi. Koska palvelimella ja puhelimella on molemmat pääsyaikaan, kummankaan ei tarvitse seurata laskuria.

Lisäksi palvelimen ja puhelimen eri aikavyöhykkeiden ongelmien välttämiseksi voimme käyttää Unix-aikaleimaa, joka on riippumaton aikavyöhykkeistä.

Unix-aika määritetään kuitenkin sekunteina, joten se muuttuu sekunnissa. Tämä tarkoittaa, että luotu salasana vaihtuu joka sekunti, mikä ei ole hyvä. Sen sijaan meidän on lisättävä merkittävä aikaväli ennen salasanan vaihtamista. Esimerkiksi Google Authenticator -sovellus muuttaa koodia 30 sekunnin välein.

laskuri = currentUnixTime / 30

Joten olemme ratkaisseet tiskin ongelman. Nyt meidän on puututtava kolmanteen ongelmaamme: salaisen avaimen jakaminen puhelinsovelluksen kanssa. Tässä QR-koodi voi auttaa meitä.

QR-koodin käyttäminen

Vaikka voimme pyytää käyttäjiä kirjoittamaan salainen avain suoraan puhelinsovellukseen, haluamme tehdä salaiset avaimet melko kauan turvallisuussyistä. Pyydä käyttäjää kirjoittamaan niin pitkä merkkijono ei olisi käyttäjäystävällinen kokemus.

Koska suurin osa älypuhelimista on varustettu kameralla, voimme käyttää sitä ja pyytää käyttäjää skannaamaan QR-koodi saadakseen salaisen avaimen siitä. Joten meidän tarvitsee vain muuntaa salainen avain QR-koodiin ja näyttää se käyttäjälle.

Olemme ratkaisseet kaikki kolme ongelmaa! Ja nyt tiedät kuinka TOTP toimii. Katsotaanpa kuinka se toteutetaan sovelluksessa.

Kuinka toteuttaa TOTP

Käytettävissä on joitain ilmaisia ​​puhelinsovelluksia (kuten Google Authenticator App, Authy ja niin edelleen), jotka voivat luoda OTP: n käyttäjälle. Siksi oman puhelinsovelluksen luominen ei useimmissa tapauksissa ole välttämätöntä.

Seuraavat pseudokoodit selittävät tapaa toteuttaa TOTP-pohjainen 2-tekijätodennus web-sovelluksessa.

Kun käyttäjä pyytää 2-tekijän todennuksen mahdollistamista
// Luo salainen avain, jonka pituus on 20.
secretKey = generatorSecretKey (20);
// Tallenna tämä salainen avain kyseisen käyttäjän tietokantaan.
saveUserSecretKey (userId, secretKey);
// Muunna salainen avain qr-kuvaksi.
qrCode = convertToQrCode (secretKey);
// lähetä qr-kuva vastauksena
vaste (qrcode);

Käyttäjää pyydetään skannaamaan tämä QR-koodi. Kun puhelinsovellus skannaa QR-koodin, se saa käyttäjän salaisen avaimen. Salaa avainta, nykyistä Unix-aikaa ja HOTP-algoritmia käyttämällä puhelinsovellus luo ja näyttää salasanan.

Pyydämme käyttäjää kirjoittamaan luodun koodin QR-koodin skannauksen jälkeen. Tämä on tarpeen, koska haluamme varmistaa, että käyttäjä on skannannut kuvan onnistuneesti ja puhelinsovellus on luonut koodin onnistuneesti.

Käyttäjä kirjoittaa sovelluksessa näkyvän koodin.
// Hae salainen avain tietokannasta.
secretKey = getSecretKeyOfUser (userId);
if (codeTypedByUser == getHOTP (secretKey, currentUnixTime / 30)) {
   enableTwoFactorAuthentication (userId);
}

Käytämme tässä palvelimen puolella olevaa HOTP-algoritmia saadaksesi OTP-pohjaisen todennuksen salaiselle avaimelle ja nykyisen unix-ajan. Jos kyseinen OTP on sama kuin käyttäjän kirjoittama, voimme ottaa käyttöön 2-kertaisen todennuksen kyseiselle käyttäjälle.

Nyt jokaisen sisäänkirjautumisen jälkeen meidän on tarkistettava, onko kyseisellä käyttäjällä kaksikerroinen todennus käytössä. Jos se on käytössä, pyydämme puhelinsovelluksessa näkyvää yhden kerran salasanaa. Ja jos kirjoitettu koodi on oikein, vasta käyttäjän todennetaan.

Käyttäjä kirjoittaa kirjautumiseen puhelinsovelluksessa näkyvän koodin
// Hae salainen avain tietokannasta.
secretKey = getSecretKeyOfUser (userId);
if (codeTypedByUser == getHOTP (secretKey, currentUnixTime)) {
   kirjautumisevästeet (userId);
}

Mitä tapahtuu, jos käyttäjä kadottaa koodin?

On olemassa pari tapaa auttaa käyttäjää palauttamaan koodi. Yleensä kun he sallivat kaksikerroisen todennuksen, voimme näyttää salaisen avaimen yhdessä QR-koodin kanssa ja pyytää heitä tallentamaan koodi jonnekin turvallisesti.

Sovellukset, kuten Google Authenticator App, antavat sinun luoda salasanan syöttämällä salainen avain suoraan. Jos käyttäjä kadottaa koodin, hän voi syöttää turvallisesti tallennetun salaisen avaimen puhelinsovellukseen luodakseen OTP: n uudelleen.

Jos meillä on käyttäjän puhelinnumero, voimme käyttää myös tekstiviestipohjaista tapaa lähettää OTP käyttäjälle auttaakseen häntä palauttamaan koodin.

Käärimistä

Kahden tekijän todennus on kasvussa. Monet verkkosovellukset ovat ottaneet sen käyttöön tietoturvan lisäämiseksi.

Toisin kuin SMS-pohjainen menetelmä, TOTP-menetelmä ei myöskään vaadi paljon ylimääräistä vaivaa. Joten tämä ominaisuus on käyttöönoton arvoinen mihin tahansa sovellukseen.