Как вы можете создать 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) относительно просты:
- Генерация HMAC на основе общего ключа и счетчика / времени
- Обрезать его безопасным способом
Обычно это усложняет управление пользователями и статическая / динамическая синхронизация.
Примерно так должно работать:
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;
}