Аднаразовыя коды могуць быць цалкам правільнымі на вашым тэлефоне і ў тую ж секунду адхілены серверам. Абодва бакі вылічваюць адну і тую ж функцыю з агульнага сакрэту і бягучага кроку часу, таму разыходжанне ў часе дае разыходжанне ў кодзе. Гэта робіць адхіленне гадзінніка хібай, значнай для бяспекі, а не проста незручнасцю.

Тут важныя два гадзіннікі, і выпраўленне бачнага — гэта тое, што людзі робяць першым. Той, які звычайна патрабуе ўвагі, — іншы.

Код — гэта функцыя часу, а не пароль

TOTP бярэ агульны сакрэт і лічыльнік, вытворны ад бягучага часу, прапускае абодва праз хэш з ключом і ўсякае вынік да кароткага дзесятковага радка; гэта апісана ў RFC 6238. Лічыльнік прасоўваецца з кожным крокам часу, звычайна трыццаць секунд, таму той жа сакрэт дае новае значэнне, калі крок змяняецца. Правяральнік пералічвае чаканае значэнне для бягучага кроку і параўноўвае, што патрабуе таго ж сакрэту і таго ж уяўлення пра цяперашні момант. Пароль застаецца прыдатным да перавыкарыстання, пакуль яго не зменяць, а гэтае значэнне сканчаецца на мяжы, якую кліент не бачыць.

Вось чаму адзін код працуе, а наступны адмаўляе праз імгненне. Гэта таксама тлумачыць, чаму капіраванне кода з паведамлення ў чаце — такая ненадзейная звычка.

Два гадзіннікі павінны ўзгадніцца, а не адзін

Матэрыял рэгістрацыі — гэта першае агульнае, а час — другое. Калі сакрэт правільны, а гадзіннікі адрозніваюцца больш за дапушчальнае акно, кожнае згенераванае значэнне трапляе ў няправільны крок і адхіляецца. Калі гадзіннікі ўзгадняюцца, а сакрэт няправільны, кожнае значэнне таксама адхіляецца, і абодва збоі выглядаюць аднолькава на экране ўваходу. Раздзяленне іх азначае праверку запісу ўліковага запісу і часу незалежна, менавіта ў такім парадку.

Гадзіннік правяральніка заслугоўвае такой жа пільнасці, як і гадзіннік прылады. Сервер, крыніца часу якога зламаная, адхіляе правільныя коды ад усіх карыстальнікаў адразу, і справаздачы будуць апісваць раптоўны збой, а не адхіленне. Гэтую заканамернасць варта распазнаваць, бо яе выпраўленне належыць серверу, а не сотні тэлефонаў.

Што каштуе пашырэнне акна

Рэалізацыі могуць прымаць код з суседняга кроку, каб паглынуць малыя адрозненні, і гэтая цярпімасць — рашэнне дызайну, а не бясплатная карэкціроўка. Кожны дадатковы крок памнажае колькасць значэнняў, сапраўдных у любы момант, што менавіта і падабаецца атакуе, які спрабуе ўгадаць. Правіла паўтору мае значэнне з той жа прычыны, бо код, прыняты двойчы, — гэта код, які карысна ўцёк. Адміністратар, які пашырае акно, каб заглушыць скаргі, абменьвае рэальную ўласцівасць на касметычнае паляпшэнне.

Выпраўленне гадзінніка — гэта рамонт, а пашырэнне акна — заспакаяльны сродак. Першае прыбірае прычыну, другое яе хавае.

Праверце абодва гадзіннікі, перш чым паўтарыць спробу

Прачытайце час на прыладзе і на серверы і параўнайце зрухі, а не паказаны мясцовы час. Каманды ніжэй паказваюць стан сінхранізацыі і сыры момант UTC на хосте або серверы Linux. Запусціце іх на абодвух канцах, перш чым змяняць любыя налады аўтэнтыфікацыі.

timedatectl
date -u +'%Y-%m-%dT%H:%M:%SZ'
chronyc tracking
timedatectl timesync-status

Зрух, вымераны ў секундах, бясшкодны, вымераны ў хвілінах — тлумачыць адмову, а сістэма, якая паведамляе пра адсутнасць крыніцы сінхранізацыі, — кандыдат на абодва. Параўнайце два адмеціны часу UTC напрамую, бо мясцовы час уключае часавы пояс, якога алгарытм ніколі не бачыць. Калі зрухі малыя, а коды ўсё яшчэ не працуюць, спыніцеся наладжваць гадзіннікі і замест гэтага агледзьце запіс рэгістрацыі. Паўторныя спробы супраць заблакаванага ўліковага запісу робяць зыходную хібу цяжэй назіранай.

Запішыце час адмовы, зрух і тэкст памылкі, а агульны сакрэт пакіньце па-за гэтым. Падтрымка можа працаваць з першымі трыма і ніколі не павінна бачыць чацвёртае.

Падобныя артыкулы