Как работают токены RSA?

Я хотел бы понять, как работают токены RSA (SecurID), какой алгоритм там используется, тот же ли это алгоритм, что и обычное шифрование/дешифрование RSA?


person Jau L    schedule 01.12.2011    source источник
comment
Какой тип токенов? Тот, который может подписывать данные или ключи шифрования/дешифрования, или SecurID?   -  person osgx    schedule 01.12.2011
comment
Для таких аутентификаторов существует стандарт TOTP, но я не знаю, Токены RSA соответствуют этому стандарту.   -  person CodesInChaos    schedule 11.08.2014
comment
Очень полное объяснение (хотя и не очень техническое) см. на ais-cur.com/IntrotoSecurID.pdf.   -  person tomasyany    schedule 19.11.2015
comment
Это должно быть перенесено в обмен стека безопасности. Запуск модератора!   -  person Kellen Stuart    schedule 09.01.2018
comment
Хорошее общее объяснение можно найти здесь: Как работают ключи RSA SecureID®?< /а>   -  person John Bødker    schedule 06.08.2018


Ответы (5)


Ссылка на Вики

Механизм аутентификации RSA SecurID состоит из «токена» — либо аппаратного (например, USB-ключ), либо программного (программный токен), — который назначается пользователю компьютера и генерирует код аутентификации с фиксированными интервалами (обычно 60 секунд) с использованием встроенные часы и закодированный на заводе случайный ключ карты (известный как «начальное число»). токены приобретаются1.

Таким образом, это может иметь что-то, связанное с алгоритмом открытого ключа RSA. Мало что известно о реальном внутреннем устройстве SecurID (безопасность по неизвестности), но есть некоторый анализ, например. начальный анализ безопасности и многое другое внизу страницы SecurID в Википедии.

Кроме того, аппаратные токены являются защищенными от несанкционированного доступа, поэтому практически невозможно скопировать украденный токен.

ОБНОВЛЕНИЕ: благодаря eyaler в классическом SecurID нет открытых/закрытых ключей; они основаны на «общем секрете», а не на асимметричном алгоритме. В Википедии говорится, что вариант AES-128 используется для генерации кодов токенов из секретного ключа ("seed"). Секретный ключ закодирован в ключ на заводе.

person osgx    schedule 01.12.2011
comment
Вместо того, чтобы ссылаться на нижнюю часть страницы SecureID в Википедии, пожалуйста, дайте прямую ссылку на абзац или, что еще лучше, подведите итоги здесь. - person Tim D; 14.08.2015

Вы можете посмотреть, как это делается на самом деле, на http://seclists.org/bugtraq/2000/Dec/459

(упрощенный) механизм

hash = <some initial value>
every x seconds do:
   hash = hashfunction(hash + secret_key)
   print hash
person VolkerK    schedule 01.12.2011
comment
Но это будет означать, что если хэш в момент времени T, скажем, h(T) известен, хэш в момент времени t + T, h(t+T) должен быть вычислен путем последовательного вычисления всех промежуточных хэшей. - person Ustaman Sangat; 22.10.2015
comment
И как мы можем быть уверены, что время на токене будет такое же, как и на сервере. Конечно, они могут стать прежними, но если это не супер-пупер атомные швейцарские часы, я не думаю, что они останутся прежними (если только токен не будет время от времени подключаться к Интернету для обновления внутренних часов). - person tomasyany; 19.11.2015
comment
Эти несвязанные токены обычно имеют срок службы. В течение этого времени rtc устройства должен быть достаточно точным, чтобы оставаться в пределах определенного временного интервала. Не имеет (большого) значения, если он сдвинется на секунду за два года; сервер компенсирует это, принимая большее окно (в указанных пределах). Но если RCC дрейфует намного дальше или вообще теряет след, жетон становится недействительным. - person VolkerK; 19.11.2015
comment
@VolterK Не совсем так. Вы не можете полагаться на достаточно точную для такого рода вещей. Я нашел фактический ответ на ais-cur.com/IntrotoSecurID.pdf (стр. 10 и 12). Они регулируют возможные временные дрейфы с вводом данных пользователем. У меня нет места, чтобы дать здесь более подробное объяснение, но в ссылке, которую я разместил, они очень ясно объясняют это в разделе «Действительное временное окно токена и настройка дрейфа часов». - person tomasyany; 19.11.2015
comment
Итак, какая часть моего комментария неверна или не совсем верна? Брошюра, на которую вы ссылаетесь, говорит то же самое - сервер принимает некоторые дрейфы. Это также относится к временной задержке, вызванной этими медленно проводящими мокрыми мешками (также известными как люди). Точность RTC не является большой проблемой, время работы от батареи возможно по-прежнему является проблемой. Даже мои часы за 2 евро (4DM) в те дни, когда я считал Knight Rider крутым (середина 80-х), были бы точны в течение года или около того. И DS3231, например. предполагается, что он останется в пределах 2 частей на миллион в год и стоит ‹50c, см. amazon.com/Donop-DS3231-AT24C32-precision-Arduino/dp/B00HCB7VYS - person VolkerK; 19.11.2015
comment
@VolkerK Нет, в брошюре сказано не то же самое, это похоже, но не то же самое. Разница в том, что система не полагается на точность, она обновляет время на сервере в соответствии с токеном, предоставленным пользователем. Так что, если, например, пользователь дает последний (но не текущий) токен, сервер теперь знает, что время токена смещается, и поэтому обновляет свое время, чтобы оно соответствовало токену. Другими словами, вы можете использовать один и тот же токен вечно, если используете его регулярно. Если вы не используете его в течение многих лет, то токен, который вы передадите серверу, будет слишком старым, чтобы сервер мог обновить себя. - person tomasyany; 19.11.2015
comment
@VolkerK ... но даже эту последнюю проблему можно решить. Вся моя мысль в том, что сервер обновляет себя полученным кодом, и именно здесь ваш комментарий был не совсем верным: ибо имеет значение, дрейфует ли он на секунду в течение двух лет (скорее имеет значение, когда он перемещается с минуты на год). - person tomasyany; 19.11.2015
comment
Хорошо, это (щедрая) дополнительная функция готового решения RSA. Часы устройства по-прежнему должны оставаться в пределах определенного периода времени. Я отказываюсь от конкретных секунд и минут и заменяю их неким максимальным временным интервалом (который вам нужно найти в документации по продукту). - person VolkerK; 19.11.2015
comment
если это так, то, к вашему сведению, я узнал 1 код доступа и использовал его через 2 часа, и он сработал.. как это возможно ?? - person Chaitanya Uttarwar; 09.11.2017
comment
Я не вижу упоминания о времени в этом примере. Это означает, что каждый раз будет создаваться один и тот же хэш и значение? - person Joe Phillips; 01.05.2018
comment
@JoePhillips: каждые x секунд делайте ‹- вот так ;-) - person VolkerK; 03.05.2018
comment
@VolkerK Извините, я должен был сказать, что время не хэшируется, поэтому хэш никогда не изменится? Вам нужно было бы где-то включить текущее время внутри хэш-функции? - person Joe Phillips; 03.05.2018

Я могу дать вам представление о том, как работают мобильные аутентификаторы Blizzard, поскольку их код исходный код открыт. (архив)

Основная суть такова:

  • генерировать хэш, используя различные секреты
  • но также включать количество 30-секундных интервалов с некоторого времени начала (например, 01.01.1970)

Вкратце псевдокод это:

String GetCurrentFOBValue()
{
   // Any code is released into the public domain. No attribution required.

   // Calculate the number of intervals since January 1 1970 (in UTC)
   // The Blizzard authenticator rolls over every 30 seconds,
   // so codeInterval is the number of 30 second intervals since January 1 1970.
   // RSA tokens roll over every minute; so your counter can be the number 
   // of 1 minute intervals since January 1, 1970
   // Int64 codeInterval = GetNumberOfIntervals();
   Int64 codeInterval = (DateTime.Now - new DateTime(1970,1,1)).TotalSeconds / 30;

   // Compute the HMAC_SHA1 digest of the code interval, 
   // using some agreed-upon 20-bytes of secret key material.
   // We will generate our 20-bytes of secret key material by
   // using PBKDF2 from a password. 
   // Blizzard's mobile authenticator is given secret key material
   // when it enrolls by fetching it from the web-site.
   Byte[] secret = PBKDF2("Super-secret password that our FOB knows", 20); //20 bytes

   // Compute a message digest of codeInterval using our shared secret key
   Byte[] hmac = HMAC(secret, codeInterval);

   // Pick four bytes out of the hmac array, and convert them into a Int32.
   // Use the last four bits of the digest as an index 
   // to which four bytes we will use to construct our Int32
   int startIndex = hmac[19] & 0x0f;

   Int32 value = Copy(hmac, startIndex, 4).ToUInt32 & 0x7fffffff; 

   // The blizzard authenticator shows 8 digits
   return String.Format("%.8d", value % 100000000);

   // But we could have just as easily returned 6, like RSA FOBs do
   return String.Format("%.6d", value % 1000000);
}
person Ian Boyd    schedule 29.10.2012
comment
Этот код выглядит как реализация TOTP с глупым использованием последнего байта для определения того, какие байты выводить. - person CodesInChaos; 11.08.2014
comment
@CodesInChaos Да, аутентификатор Battle.NET является FOB. - person Ian Boyd; 11.08.2014

Вы можете обратиться к RFC TOTP: алгоритм одноразового пароля на основе времени

Как ясно описано в этом, точный алгоритм, используемый в токенах RSA (SecurID), представляет собой TOTP (алгоритм одноразового пароля на основе времени), алгоритм хеширования.

Семя (может быть сгенерировано вариантом AES-128) уже было сохранено в токене до того, как мы его использовали.

person kagb    schedule 08.02.2016
comment
RFC 6238 не упоминает RSA или SecurID. Есть ли другой источник, предполагающий, что они используют тот же алгоритм? - person jsha; 15.09.2017

@VolkerK's answer ссылается на код C, описывающий алгоритм для "64-битных" токенов RSA, которые используют по существу пользовательский алгоритм (реверс-инжиниринг ~ 2000 г.).

Однако, если вас интересует алгоритм, используемый более современными «128-битными» токенами (включая вездесущие аппаратные токены SID700 и эквивалентные программные токены), взгляните на исходный код для stoken, проект с открытым исходным кодом, который тщательно документирует их работу; securid_compute_tokencode — основная точка входа.

По сути алгоритм работает так:

  • Генерация ключей из текущего времени и серийного номера
  • Неоднократно шифруйте секрет/начальное число с помощью 128-битного AES.
  • Извлеките цифры из десятичного представления вывода и добавьте PIN-код для надежности.

Это не так уж сильно отличается от открытого стандартного алгоритма TOTP (часть Инициатива открытой аутентификации), используемая в Google Authenticator, YubiKey, Symantec VIP-доступ и т. д.… ПРОСТО МОАР СПЕШУЛ И СОБСТВЕННОСТЬ ДЛЯ ЭКСТРА СЕКУРИТЕХ!

person Dan Lenski    schedule 15.01.2018