代码之家  ›  专栏  ›  技术社区  ›  InverseFalcon

安卓和服务器之间的密钥不同

  •  1
  • InverseFalcon  · 技术社区  · 14 年前

    我正在使用hotp算法(RFC4226)开发一次性密码应用程序。我有一个用于生成OTP的Android应用程序(通过模拟器),以及一个用于验证的服务器端应用程序。他们自己都工作得很好,而且都通过了测试。

    但是,我在设备上生成的密钥与我在服务器上生成的密钥不同,即使输入是硬编码的,并且它们之间是相同的。这会导致在设备和服务器上生成不同的一次性密码,这会破坏我生成有效一次性密码的能力。我想知道为什么会发生这种情况,如果有什么我能做的。

    服务器和设备模拟器之间的代码相同,用于构造密钥和从密钥生成一次性密码。我检查了设备和服务器上的keyspec中的字节,它们是相同的。但是,当我从secretkey.getEncoded()查看字节时,secretkeyFactories生成的键(都来自desedekeyspecs)有细微的差别。如果我使用des而不是三重des,我会看到类似的区别。

    有趣的是,在我的Android项目中,keyspec和生成的secretkey中的字节是一致的(尽管被截断了),但是在服务器上,keyspec和生成的secretkey之间的字节偶尔会有一个差异。这是正常的吗?在使用des和三重des时,我读了一些关于校验位改变的内容,所以我不确定这是否是一个问题。

    我也知道Android使用的是BouncyCastle,但我的服务器使用的是SunJCE。我的理解是,这不应该出现问题,我想知道当使用两个不同的提供者时,这是否是一个已知的情况。我有非常有限的能力得到弹跳城堡服务器端。

    请给我建议和启示?

    1 回复  |  直到 14 年前
        1
  •  1
  •   InverseFalcon    14 年前

    似乎其他人已经检测到了问题和临时解决方案。手机上的BC实现和sunjce在生成密钥时如何处理奇偶校验位之间存在差异。看起来BouncyCastle可能发布了一个更新来解决这个问题:

    http://code.google.com/p/android/issues/detail?id=3143