Как сгенерировать секретный ключ, чтобы получить соответствие TOTP для HMAC SHA512 с RFC6238 и RFC4086?

Я должен сделать HTTP-запрос POST к URL-адресу http://example.com/test который содержит строку JSON в качестве части тела, заголовки "Content-Type:application/json" и "Authorization: Basic userid:password". userid - это abc@example.com, а пароль должен состоять из 10 цифр. Одноразовый пароль, основанный на времени, соответствует RFC6238 TOTP с использованием HMAC-SHA-512 для хэш-функции.

Общий секретный ключ токена должен быть "abc@example.comTEXT5" без двойных кавычек.

Итак, для достижения вышеизложенного я модифицировал код Java RFC6238 RC6238 TOTP Algo

Чтобы получить TOTP, я преобразовал общий секретный ключ "abc@example.comTEXT5" в HMAC-SHA512 с помощью инструмента онлайн-конвертации, а также некоторых кодов, которые генерируют тот же код HEX длиной 128 символов.

Выполнение запроса всегда отвечает, что "TOTP не так".

Я заметил, что сгенерировал неправильный секретный ключ, поэтому неверный TOTP. Итак, как я могу сгенерировать правильный секретный ключ, который соответствует HMAC-SHA512 с Java-кодом алгоритма RFC6238?

В алгоритме для ключа есть ключ по умолчанию:

String seed64 = "3132333435363738393031323334353637383930" +
         "3132333435363738393031323334353637383930" +
         "3132333435363738393031323334353637383930" +
         "31323334";

Как я могу получить такой seed64 для моего общего секрета "abc@example.comTEXT5"? Мой модифицированный код - 10-значный TOTP

Я ценю помощь от всех!

0 ответов

Пример 64-байтового начального числа в Приложении A RFC 6238 является версией ASCII-секрета в кодировке HEX. 12345678901234567890 приведено в Приложении B, в котором содержится таблица истинности.

ASCII 1  2  3  4  5  6  7  8  9  0  1  2  3  4  5  6  7  8  9  0
HEX   31 32 33 34 35 36 37 38 39 30 31 32 33 34 35 36 37 38 39 30

Если вы хотите преобразовать свой общий секрет, используя тот же шаблон, вы должны преобразовать abc@example.comTEXT5 в HEX в строковом формате, если вы используете пример кода, представленный в Приложении А.

Это получится в следующей строке HEX:

616263406578616D706C652E636F6D5445585435

Для построения примера начального 64-байтового начального числа, используемого для хэша SHA-512, исходные 20 байтов повторяются, чтобы получить общее количество 64 байта для достижения оптимальной длины ключа для хэша SHA-512.

Если вы сделаете то же самое с вашим примером строки, вы получите следующее семя:

String seed64 = "616263406578616D706C652E636F6D5445585435" +
         "616263406578616D706C652E636F6D5445585435" +
         "616263406578616D706C652E636F6D5445585435" +
         "61626340";

Если вы используете оставшуюся часть примера кода для вычисления шага по времени и запрашиваете 10-значный код TOTP, я предполагаю, что он будет работать для вас.

Если вы используете что-то подобное в работе, вы можете использовать более случайно сгенерированный секрет.

Например, чтобы создать 64-байтовый секрет для SHA-512, вы можете сделать что-то вроде:

  public static String generateRawSecret(int length) {
    byte[] buf = new byte[length];
    new SecureRandom().nextBytes(buf);
    String rawSecret = Base64.getEncoder().encodeToString(buf);
    return rawSecret.substring(1, length + 1);
  }

  // Random 64 byte secret
  String secret = generateRawSecret(64);

Похоже, вы уже получили большую часть этого кода, но если вам нужны дополнительные примеры Java, следующая ссылка представляет собой проект GitHub, который имеет простой служебный класс с кучей тестов. https://github.com/FusionAuth/fusionauth-2FA

Другие вопросы по тегам