Как вы можете создать OTP с system.security.cryptography, который может быть аутентифицирован на клиенте?

Кто-нибудь знает, где я могу найти пример кода для этого с пространством имен system.security.cryptography - или инструкции, выполняемые разработчиком?

Цель - добавить двухфакторную аутентификацию на сайт asp.net. На веб-сайте я хочу попросить пользователя ввести пароль (аналогично, если он получил его от брелка). На стороне клиента я хочу предоставить vb.net программу windows.forms, которая генерирует правильный код доступа.

Я хочу сделать это с пространством имен system.security.cryptography в небольшом масштабе. Я искал пример кода, который я не хочу связывать с устройствами или приобретать устройства сервера аутентификации.

Большинство алгоритмов требуют высшей математики или для других платформ, таких как Linux или PHP. Я ищу.net эквивалент.

1 ответ

Криптографические части RFC4226 (OTP на основе счетчика) или Draft-mraihi-totp- time-based (на основе времени OTP) относительно просты:

  1. Генерация HMAC на основе общего ключа и счетчика / времени
  2. Обрезать его безопасным способом

Обычно это усложняет управление пользователями и статическая / динамическая синхронизация.

Примерно так должно работать:

public static int CalculateHotp(byte[] key, byte[] counter)
{
    var hmacsha1 = new HMACSHA1(key);
    byte[] hmac_result = hmacsha1.ComputeHash(counter);
    int offset = hmac_result[19] & 0x0f;
    int bin_code = (hmac_result[offset]  & 0x7f) << 24
                   | (hmac_result[offset+1] & 0xff) << 16
                   | (hmac_result[offset+2] & 0xff) <<  8
                   | (hmac_result[offset+3] & 0xff);
    int hotp = bin_code % 1000000;
    return hotp;
}
Другие вопросы по тегам