Я работаю над одноразовым приложением паролей, используя алгоритм hotp (RFC 4226). У меня есть приложение Android (через симулятор) для генерации OTP и серверное приложение для проверки. Само по себе оба работают нормально и проходят тесты.
Однако секретный ключ, который я генерирую на своем устройстве, не совпадает с секретным ключом, который я генерирую на сервере, даже когда входы жестко закодированы и одинаковы между ними. Это приводит к разным разовым паролям, генерируемым на устройстве и сервере, что разрушает мою способность генерировать действительные одноразовые пароли. Я пытаюсь понять, почему это происходит, и если я что-то могу с этим поделать.
Код идентичен между сервером и симулятором устройства для создания SecretKeys и создания одноразовых паролей из ключей. Я проверил байты в ключах на устройстве и на сервере, и они идентичны. Тем не менее, ключи, созданные SecretKeyFactories (как из DESedeKeySpecs), имеют тонкие отличия, когда я просматриваю байты из secretKey.getEncoded(). Я вижу похожие различия, если я использую DES вместо тройного DES.
Интересно, что в моем Android-проекте байты в KeySpec и сгенерированный SecretKey являются согласованными (хотя и усеченными), но на сервере периодически возникают различие в байтах между KeySpec и сгенерированными Секретный ключ. Это нормально? Я читал что-то о битовых изменениях четности при использовании DES и тройного DES, поэтому я не уверен, что это проблема.
Я также знаю, что Android использует Bouncy Castle, но мой сервер использует SunJCE. Я понимаю, что это не должно представлять проблемы, и я хотел бы знать, является ли это известным случаем при использовании двух разных поставщиков. У меня очень ограниченная возможность получить Bouncy Castle на стороне сервера.
Совет и просвещение, пожалуйста?
Похоже, что кто-то еще обнаружил проблему и временное решение. Это разница между тем, как реализация BC на телефоне и SunJCE обрабатывают биты четности при создании секретных ключей. Похоже, Bouncy Castle может выпускать обновление, чтобы решить эту проблему: