Пример 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