Как вы можете создать OTP с system.security.cryptography, который может быть аутентифицирован на клиенте? - PullRequest
2 голосов
/ 12 сентября 2010

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

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

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

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

1 Ответ

1 голос
/ 13 сентября 2010

Криптографические части RFC4226 (на основе счетчика OTP) или draft-mraihi-totp-time-time (на основе времени 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;
}
...