我正在使用hotp算法(RFC4226)开发一次性密码应用程序。我有一个用于生成OTP的Android应用程序(通过模拟器),以及一个用于验证的服务器端应用程序。他们自己都工作得很好,而且都通过了测试。
但是,我在设备上生成的密钥与我在服务器上生成的密钥不同,即使输入是硬编码的,并且它们之间是相同的。这会导致在设备和服务器上生成不同的一次性密码,这会破坏我生成有效一次性密码的能力。我想知道为什么会发生这种情况,如果有什么我能做的。
服务器和设备模拟器之间的代码相同,用于构造密钥和从密钥生成一次性密码。我检查了设备和服务器上的keyspec中的字节,它们是相同的。但是,当我从secretkey.getEncoded()查看字节时,secretkeyFactories生成的键(都来自desedekeyspecs)有细微的差别。如果我使用des而不是三重des,我会看到类似的区别。
有趣的是,在我的Android项目中,keyspec和生成的secretkey中的字节是一致的(尽管被截断了),但是在服务器上,keyspec和生成的secretkey之间的字节偶尔会有一个差异。这是正常的吗?在使用des和三重des时,我读了一些关于校验位改变的内容,所以我不确定这是否是一个问题。
我也知道Android使用的是BouncyCastle,但我的服务器使用的是SunJCE。我的理解是,这不应该出现问题,我想知道当使用两个不同的提供者时,这是否是一个已知的情况。我有非常有限的能力得到弹跳城堡服务器端。
请给我建议和启示?