То, что вы описываете (SecureID RSA), основано на алгоритме TOTP.
Мало того, что проблема синхронизации, которую вы описываете, является проблемой, вы также должны иметь в виду, что не все часы работают с одинаковой скоростью. Часы клиента могут идти немного быстрее или медленнее, чем часы вашего сервера, и со временем они могут рассинхронизироваться на несколько минут. Алгоритм TOTP обрабатывает это (см. раздел 6 RFC): когда сервер проверяет код, который он получает от клиента, не только на текущий код времени, но также на несколько кодов в будущем и несколько кодов в прошлом.
Client Server
Time Code Code Time Offset
Match 849207 8:30:00 -0:00
641239 8:30:30 -0:00
761548 8:31:00 -0:00
Current client time 8:30:00 849207 103970 8:31:30 -0:00 Current server time
846541 8:32:00 -0:00
861321 8:32:30 -0:00
132465 8:33:00 -0:00
Если сервер обнаруживает, что коды рассинхронизированы на определенную величину, он вычисляет смещение (на сколько времени рассинхронизировались часы), а затем учитывает это смещение в будущем.
Client Server
Time Code Code Time Offset
628484 8:45:00 -1:30
137864 8:45:30 -1:30
679913 8:46:00 -1:30
Current client time 8:45:00 264951 Match 264951 8:46:30 -1:30 Current server time
971034 8:47:00 -1:30
626378 8:47:30 -1:30
599171 8:48:00 -1:30
Даже если часы продолжают расходиться, сервер просто повторно синхронизируется, увеличив смещение, когда коды слишком сильно рассинхронизируются.
Если вы продолжите это, я настоятельно рекомендую вам использовать библиотеку, совместимую с RFC. Большинство языков имеют реализации с открытым исходным кодом, которые относительно легко найти, что упростит интеграцию этой аутентификации для ваших потребителей. Существует несколько реализаций C#, эта утверждает, что работает с аутентификатором Google (который, как я знаю, совместим с TOTP RFC).
Примечание. Большинство библиотек TOTP не выполняют за вас процесс повторной синхронизации, поскольку вам необходимо сохранить смещение синхронизации. Это довольно просто создать самостоятельно, просто прочитайте соответствующие разделы RFC, чтобы полностью понять процесс.
P.S.
Если вы планируете использовать это для межмашинной аутентификации, я настоятельно рекомендую вам подумать, действительно ли это того стоит. Хотя это довольно легко реализовать, это все же намного больше работы, чем просто прямое имя пользователя и пароль, и, вероятно, не добавляет (если вообще дает) реальной безопасности (если вы не использовали SSL, то я бы сказал иначе. )
Системы, подобные TOTP, работают с общим секретным ключом (code=TOTP(key, time)
). Это полезно для людей, потому что злоумышленники не могут украсть код или общий секрет без физического доступа к токену SecureID (или любой другой марки). Единственная атака — получить текущий код от пользователя и немедленно его использовать. Однако это неверно для межмашинной аутентификации, потому что клиентская машина должна иметь доступ к общему секрету для генерации кодов. Если администратор или злоумышленник может украсть статический пароль из клиентской системы, нет никаких причин, по которым они не могут вместо этого украсть общий секрет.
Я бы сказал, что в большинстве случаев единственная вещь, которую TOTP-подобная аутентификация добавляет к межмашинному взаимодействию, — это уровень неясности. Просто мои два цента.
person
Syon
schedule
30.08.2013