Zakaj kode TOTP odpovejo, ko ura naprave zaide
Koda je zgoščena vrednost skrivnosti in trenutnega časovnega koraka. Primerjajte odstopanja na obeh koncih in nato popravite uro, namesto da bi razširili okno.
Enkratne kode so lahko v telefonu popolnoma pravilne, strežnik pa jih v isti sekundi zavrne. Obe strani izračunata isto funkcijo iz skupne skrivnosti in trenutnega časovnega koraka, zato nesoglasje glede časa povzroči nesoglasje glede kode. Zaradi tega je zamik ure hiba, pomembna za varnost, in ne le nadloga.
Tu sta pomembni dve uri, popravljanje vidne pa je tisti del, ki ga ljudje naredijo najprej. Tista, ki običajno potrebuje pozornost, je druga.
Koda je funkcija časa, ne geslo
TOTP vzame skupno skrivnost in števec, izpeljan iz trenutnega časa, oba požene skozi zgoščeno vrednost s ključem in rezultat skrajša v kratek decimalni niz, kot je določeno v RFC 6238. Števec napreduje ob vsakem časovnem koraku, običajno trideset sekund, zato ista skrivnost ustvari novo vrednost, ko se korak spremeni. Preverjevalec znova izračuna pričakovano vrednost za trenutni korak in primerja, kar zahteva isto skrivnost in isto predstavo o zdaj. Geslo ostane znova uporabno, dokler se ne spremeni, medtem ko ta vrednost poteče na meji, ki je odjemalec ne vidi.
Zato ena koda deluje, naslednja pa odpove nekaj trenutkov pozneje. To tudi pojasni, zakaj je kopiranje kode iz klepetalnega sporočila tako nezanesljiva navada.
Dve uri se morata ujemati, ne ena
Material za registracijo je prva skupna stvar, čas pa druga. Če je skrivnost pravilna, medtem ko se uri razlikujeta bolj od dovoljenega okna, vsaka ustvarjena vrednost pade v napačen korak in je zavrnjena. Če se uri ujemata, medtem ko je skrivnost napačna, je vsaka vrednost prav tako zavrnjena, in oba neuspeha sta na prijavnem zaslonu videti enako. Ločiti ju pomeni preveriti vnos računa in čas ločeno, v tem vrstnem redu.
Ura preverjevalca si zasluži enako pozornost kot ura naprave. Strežnik s pokvarjenim virom časa zavrne pravilne kode vseh uporabnikov hkrati, poročila pa bodo opisala nenaden izpad in ne zamika. Ta vzorec velja prepoznati, ker popravek spada na strežnik in ne na sto telefonov.
Kaj stane razširitev okna
Izvedbe lahko sprejmejo kodo iz sosednjega koraka, da vpijejo majhne razlike, in ta toleranca je oblikovalska odločitev, ne brezplačna prilagoditev. Vsak dodatni korak pomnoži število vrednosti, veljavnih v katerem koli trenutku, kar je natanko tisto, kar ima raje napadalec, ki ugiba. Pravilo proti ponovitvi je pomembno iz istega razloga, saj je koda, sprejeta dvakrat, koda, ki je koristno uhajala. Skrbnik, ki razširi okno, da utiša pritožbe, zamenja resnično lastnost za kozmetično izboljšavo.
Popravljanje ure je popravilo, razširitev okna pa pomirjevalo. Prvo odstrani vzrok, drugo ga skrije.
Preverite obe uri, preden poskusite znova
Preberite čas na napravi in na strežniku ter primerjajte odstopanja, ne prikazanih lokalnih časov. Spodnji ukazi prikazujejo stanje sinhronizacije in surovi trenutek UTC na gostitelju ali strežniku Linux. Zaženite jih na obeh koncih, preden spremenite katero koli nastavitev preverjanja pristnosti.
timedatectl
date -u +'%Y-%m-%dT%H:%M:%SZ'
chronyc tracking
timedatectl timesync-status
Odstopanje, merjeno v sekundah, je neškodljivo, tisto v minutah pojasni zavrnitev, sistem, ki ne poroča o nobenem viru sinhronizacije, pa je kandidat za oboje. Primerjajte oba časovna žiga UTC neposredno, saj lokalni čas vključuje časovni pas, ki ga algoritem nikoli ne vidi. Če so odstopanja majhna in kode še vedno odpovedo, prenehajte prilagajati ure in raje preglejte vnos registracije. Ponovljeni poskusi proti zaklenjenemu računu otežijo opazovanje prvotne hibe.
Zabeležite čas zavrnitve, odstopanje in besedilo napake, skupno skrivnost pa pustite zunaj tega. Podpora lahko dela s prvimi tremi in ne bi smela nikoli videti četrtega.