Защо кодовете TOTP се провалят, когато часовникът на устройството се измести
Кодът е хеш на тайната и текущата времева стъпка. Сравнете отместванията в двата края, след което коригирайте часовника, вместо да разширявате прозореца.
Еднократните кодове могат да бъдат напълно правилни на телефона ви и отхвърлени от сървъра в същата секунда. Двете страни изчисляват една и съща функция от споделена тайна и текущата времева стъпка, така че разминаване относно времето води до разминаване относно кода. Това прави отклонението на часовника дефект със значение за сигурността, а не просто досада.
Тук имат значение два часовника и поправянето на видимия е частта, която хората правят първа. Този, който обикновено се нуждае от внимание, е другият.
Кодът е функция на времето, а не парола
TOTP взема споделената тайна и брояч, изведен от текущото време, прекарва и двете през хеш с ключ и съкращава резултата до кратък десетичен низ; това е определено в RFC 6238. Броячът напредва с всяка времева стъпка, обикновено тридесет секунди, така че същата тайна дава нова стойност, когато стъпката се смени. Проверяващият преизчислява очакваната стойност за текущата стъпка и сравнява, което изисква същата тайна и същата представа за сегашния момент. Паролата остава за многократна употреба, докато не бъде сменена, докато тази стойност изтича на граница, която клиентът не вижда.
Ето защо един код работи, а следващият се проваля мигове по-късно. Това също обяснява защо копирането на код от чат съобщение е толкова ненадежден навик.
Два часовника трябва да съвпадат, а не един
Материалът за записване е първото споделено нещо, а времето е второто. Ако тайната е правилна, докато часовниците се различават с повече от допустимия прозорец, всяка генерирана стойност попада в грешната стъпка и се отхвърля. Ако часовниците съвпадат, докато тайната е грешна, всяка стойност също се отхвърля, и двата отказа изглеждат идентични от екрана за вход. Разделянето им означава проверка на записа на акаунта и на времето независимо, в този ред.
Часовникът на проверяващия заслужава същото внимание като този на устройството. Сървър, чийто източник на време е повреден, отхвърля правилни кодове от всеки потребител наведнъж и отчетите ще описват внезапен престой, а не отклонение. Този модел си заслужава да бъде разпознат, защото поправката му е на сървъра, а не на сто телефона.
Какво струва разширяването на прозореца
Реализациите могат да приемат код от съседна стъпка, за да поемат малки разлики, и тази толерантност е проектно решение, а не безплатна корекция. Всяка допълнителна стъпка умножава броя на стойностите, валидни във всеки момент, което е точно това, което предпочита атакуващият, който гадае. Правилото за повторение има значение по същата причина, защото код, приет два пъти, е код, който е изтекъл полезно. Администратор, който разширява прозореца, за да заглуши жалбите, разменя реално свойство за козметично подобрение.
Коригирането на часовника е ремонтът, докато разширяването на прозореца е успокоително. Първото премахва причината, а второто я скрива.
Проверете и двата часовника, преди да опитате отново
Прочетете времето на устройството и на сървъра и сравнете отместванията, а не показаните местни времена. Командите по-долу показват състоянието на синхронизация и суровия момент в UTC на Linux хост или сървър. Стартирайте ги в двата края, преди да променяте каквато и да е настройка за удостоверяване.
timedatectl
date -u +'%Y-%m-%dT%H:%M:%SZ'
chronyc tracking
timedatectl timesync-status
Отместване, измерено в секунди, е безвредно, измерено в минути — обяснява отхвърляне, а система, която не съобщава за източник на синхронизация, е кандидат и за двете. Сравнете двата времеви печата в UTC директно, тъй като местното време включва часова зона, която алгоритъмът никога не вижда. Ако отместванията са малки и кодовете все още се провалят, спрете да настройвате часовници и вместо това прегледайте записа за записване. Повтарящите се опити срещу заключен акаунт правят първоначалния дефект по-труден за наблюдение.
Запишете времето на отхвърляне, отместването и текста на грешката, а споделената тайна оставете извън това. Поддръжката може да работи с първите три и никога не трябва да вижда четвъртото.