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

Я должен сделать HTTP-запрос POST по URL-адресу http://example.com/test, который содержит строку JSON в качестве части тела, заголовки «Content-Type: application / json» и «Authorization: Basic userid: password».userid is abc@example.com, а пароль должен состоять из 10 цифр. Одноразовый пароль на основе времени соответствует TOTP RFC6238 с использованием 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

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

1 Ответ

0 голосов
/ 21 декабря 2018

Пример 64-байтового начального числа в Приложении A RFC 6238 - это HEX-кодированная версия секрета ASCII 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 в строковом формате, если вы используете пример кода, представленный в Приложении A.

Это будет выглядеть для следующей строки 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

...