Я хотел бы понять, как работают токены RSA (SecurID), какой алгоритм там используется, тот же ли это алгоритм, что и обычное шифрование/дешифрование RSA?
Как работают токены RSA?
Ответы (5)
Ссылка на Вики
Механизм аутентификации RSA SecurID состоит из «токена» — либо аппаратного (например, USB-ключ), либо программного (программный токен), — который назначается пользователю компьютера и генерирует код аутентификации с фиксированными интервалами (обычно 60 секунд) с использованием встроенные часы и закодированный на заводе случайный ключ карты (известный как «начальное число»). токены приобретаются1.
Таким образом, это может иметь что-то, связанное с алгоритмом открытого ключа RSA. Мало что известно о реальном внутреннем устройстве SecurID (безопасность по неизвестности), но есть некоторый анализ, например. начальный анализ безопасности и многое другое внизу страницы SecurID в Википедии.
Кроме того, аппаратные токены являются защищенными от несанкционированного доступа, поэтому практически невозможно скопировать украденный токен.
ОБНОВЛЕНИЕ: благодаря eyaler в классическом SecurID нет открытых/закрытых ключей; они основаны на «общем секрете», а не на асимметричном алгоритме. В Википедии говорится, что вариант AES-128 используется для генерации кодов токенов из секретного ключа ("seed"). Секретный ключ закодирован в ключ на заводе.
Вы можете посмотреть, как это делается на самом деле, на http://seclists.org/bugtraq/2000/Dec/459 а>
(упрощенный) механизм
hash = <some initial value>
every x seconds do:
hash = hashfunction(hash + secret_key)
print hash
Я могу дать вам представление о том, как работают мобильные аутентификаторы 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);
}
Вы можете обратиться к RFC TOTP: алгоритм одноразового пароля на основе времени
Как ясно описано в этом, точный алгоритм, используемый в токенах RSA (SecurID), представляет собой TOTP (алгоритм одноразового пароля на основе времени), алгоритм хеширования.
Семя (может быть сгенерировано вариантом AES-128) уже было сохранено в токене до того, как мы его использовали.
@VolkerK's answer ссылается на код C, описывающий алгоритм для "64-битных" токенов RSA, которые используют по существу пользовательский алгоритм (реверс-инжиниринг ~ 2000 г.).
Однако, если вас интересует алгоритм, используемый более современными «128-битными» токенами (включая вездесущие аппаратные токены SID700 и эквивалентные программные токены), взгляните на исходный код для stoken, проект с открытым исходным кодом, который тщательно документирует их работу; securid_compute_tokencode
— основная точка входа.
По сути алгоритм работает так:
- Генерация ключей из текущего времени и серийного номера
- Неоднократно шифруйте секрет/начальное число с помощью 128-битного AES.
- Извлеките цифры из десятичного представления вывода и добавьте PIN-код для надежности.
Это не так уж сильно отличается от открытого стандартного алгоритма TOTP (часть Инициатива открытой аутентификации), используемая в Google Authenticator, YubiKey, Symantec VIP-доступ и т. д.… ПРОСТО МОАР СПЕШУЛ И СОБСТВЕННОСТЬ ДЛЯ ЭКСТРА СЕКУРИТЕХ!