我正在使用hotp算法(RFC 4226)进行一次性密码应用。我有一个用于otp生成的Android应用程序(通过模拟器),以及用于验证的服务器端应用程序。他们自己都工作正常并通过测试。
但是,我在设备上生成的密钥与我在服务器上生成的密钥不同,即使输入是硬编码的,也是相同的。这会导致在设备和服务器上生成不同的一次性密码,这会破坏我生成有效一次性密码的能力。我试图弄清楚为什么会发生这种情况,如果有什么我可以做的。
服务器和设备模拟器之间的代码是相同的,用于构造SecretKeys并从密钥生成一次性密码。我检查了设备和服务器上的keyspecs中的字节,它们是相同的。但是,当我从secretKey.getEncoded()查看字节时,SecretKeyFactories(来自DESedeKeySpecs)生成的密钥具有微妙的逐个差异。如果我使用DES而不是三重DES,我会看到类似的差异。
有趣的是,在我的Android项目中,KeySpec中的字节和生成的SecretKey是一致的(尽管是截断的),但在服务器上,KeySpec和生成的字节之间偶尔会出现一个一个字的差异。密钥。这是正常的吗?我在使用DES和三重DES时读到了有关奇偶校验位更改的内容,所以我不确定这是否是一个问题。
我也知道Android正在使用Bouncy Castle,但我的服务器正在使用SunJCE。我的理解是,这不应该是一个问题,我想知道在使用两个不同的提供者时这是否已知。我获得Bouncy Castle服务器端的能力非常有限。
请咨询和启发吗?
答案 0 :(得分:1)
看起来其他人已经检测到问题和临时解决方案。在生成密钥时,手机上的BC实现和SunJCE如何处理奇偶校验位之间的区别。看起来像Bouncy Castle可能正在发布更新来解决这个问题: