我正在使用 hotp 算法(RFC 4226)开发一次性密码应用程序。我有一个用于 otp 生成的 Android 应用程序(通过模拟器)和一个用于验证的服务器端应用程序。就其本身而言,两者都工作正常并通过了测试。
但是,我在我的设备上生成的密钥与我在服务器上生成的密钥不同,即使输入是硬编码的并且它们之间是相同的。这导致在设备和服务器上生成不同的一次性密码,这破坏了我生成有效一次性密码的能力。我试图弄清楚为什么会发生这种情况,如果有什么我可以做的。
服务器和设备模拟器之间的代码是相同的,用于构建 SecretKeys 并从密钥生成一次性密码。我检查了设备和服务器上 keyspecs 中的字节,它们是相同的。但是,当我从 secretKey.getEncoded() 中查看字节时,由 SecretKeyFactories(均来自 DESedeKeySpecs)生成的密钥存在细微的差异。如果我使用 DES 而不是三重 DES,我会看到类似的差异。
有趣的是,在我的Android项目中,KeySpec和生成的SecretKey中的字节是一致的(虽然被截断了),但是在服务器上,KeySpec和生成的SecretKey之间的字节偶尔会出现一对一的差异。这是正常的吗?我在使用 DES 和三重 DES 时阅读了一些关于奇偶校验位更改的内容,所以我不确定这是否是一个问题。
我也知道 Android 使用的是 Bouncy Castle,但我的服务器使用的是 SunJCE。我的理解是这不应该出现问题,我想知道这是否是使用两个不同提供程序时的已知事件。我获得 Bouncy Castle 服务器端的能力非常有限。
请给点建议和启示?