2016-08-17 3 views
1

Я понимаю, что HOTP можно использовать для создания числовых одноразовых паролей. Алгоритм позади существа:Генерирование буквенно-цифровой OTP с использованием HOTP

К секретный ключ
C быть счетчиком
HMAC (K, C) = SHA1 (К ⊕ 0x5c5c ... ∥ SHA1 (К ⊕ 0x3636 ... ∥ С)) с ⊕, как XOR , ∥ как конкатенация, (с является сообщением)

Усекать быть функцией, которая выбирает 4 байта из результата HMAC определенным образом

Тогда HOTP (K, C) математически определяется

HOTP (K, C) = усечение (HMAC (K, C)) & 0x7FFFFFFF

Я использовал следующий пример реализации для моих тестов, и это работает прекрасно:

https://svn.forgerock.org/openam/tags/10.0.0-docs/products/amserver/source/com/sun/identity/authentication/modules/hotp/HOTPAlgorithm.java

Мой вопрос заключается в том, что это возможно для генерации буквенно-цифрового OTP с использованием HOTP вместо числового. Преимущество, очевидно, состоит в том, что сила OTP увеличивается во много раз для заданной длины. Таким образом, 8-значный буквенно-цифровой код гораздо более строгий, чем 8-значный цифровой код.

Спасибо, Аби

ответ

1

Конечно, вы можете делать все, что вы хотите после того, как HMAC (K, C). Вы можете сопоставить его с HEX или буквенно-цифровым.

Но тогда вам также нужно будет создать свой собственный токен OTP - либо токен оборудования, либо приложение для смартфона. Это отличная вещь о стандартах, что вам не нужно создавать свои собственные! ;-)

+0

Спасибо cornelinux, Полезно знать, что это можно сделать. Не могли бы вы дать мне немного больше указания, как в КАК это можно сделать. Мой SHA1 возвращает значение в 20 байт (от -127 до 127). Как я могу сделать это буквенно-цифровым значением? – user1826116

+0

Сначала вы должны решить, какие символы вы хотите использовать. Таким образом, вы получаете список, возможно, (26 + 26 +10 = 56 возможных символов). Тогда вам, вероятно, следует сопоставить один байт символу ... – cornelinux

+0

ok, поэтому мне нужно отобразить 256 возможных байтовых комбинаций из HMAC на 62 возможных набора символов. Это в основном означает, что 4 байта из моего 256-байтового набора будут соответствовать 1 байту из моего 62-байтового выходного набора. Это можно легко сделать, но как вы думаете, это снижает безопасность/силу HOTP в некотором роде? – user1826116

0

Алфавитно-цифровая машина имеет сложное основание, основание 62. Если вы разрешаете еще два символа, вы можете просто использовать базу 64 (заменяя + и / на любое значение, которое вы предпочитаете).

В противном случае просто найдите библиотеку кодирования Base N, такую ​​как this one для Java (не пробовал, не могу комментировать правильность или производительность).

Это не повлияет на безопасность, так как существует соотношение 1: 1 между сгенерированными битами HOTP и данным представлением. Другими словами, различное базовое представление и алфавит - это просто другой вид с одинаковыми значениями бит.

Смежные вопросы