java - Android 和服务器之间的 key 不同

标签 java android cryptography bouncycastle one-time-password

我正在使用 hotp 算法 (RFC 4226) 开发一次性密码应用程序。我有一个用于生成 otp 的 Android 应用程序(通过模拟器)和一个用于验证的服务器端应用程序。就其本身而言,两者都运行良好并通过了测试。

但是,我在我的设备上生成的 key 与我在服务器上生成的 key 不同,即使输入是硬编码的并且它们之间是相同的。这导致在设备和服务器上生成不同的一次性密码,这破坏了我生成有效的一次性密码的能力。我想弄清楚为什么会这样,如果有什么我可以做的。

服务器和设备模拟器之间用于构造 SecretKey 和从 key 生成一次性密码的代码是相同的。我已经检查了设备和服务器上 keyspecs 中的字节,它们是相同的。但是,当我查看来自 secretKey.getEncoded() 的字节时,由 SecretKeyFactories(均来自 DESedeKeySpecs)生成的 key 具有细微的逐一差异。如果我使用 DES 而不是三重 DES,我会看到类似的差异。

有趣的是,在我的Android项目中,KeySpec和生成的SecretKey中的字节是一致的(虽然被截断了),但是在服务器上,KeySpec和生成的字节之间偶尔会出现一个差一个的差异 key 。这是正常的吗?我阅读了一些有关使用 DES 和三重 DES 时奇偶校验位更改的内容,所以我不确定这是否是个问题。

我也知道 Android 使用的是 Bouncy CaSTLe,但我的服务器使用的是 SunJCE。我的理解是这不应该成为问题,我想知道这是否是使用两个不同提供商时的已知事件。我获得 Bouncy CaSTLe 服务器端的能力非常有限。

请指教,赐教?

最佳答案

看起来其他人已经检测到问题和临时解决方案。这是电话上的 BC 实现与 SunJCE 在生成 key 时处理奇偶校验位的方式之间的差异。看起来 Bouncy CaSTLe 可能会发布更新来解决这个问题:

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

关于java - Android 和服务器之间的 key 不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3393356/

相关文章:

java - RSA数字签名失败

encryption - 最好的加密机制是Triple DES或RC4?

java - 在 Apache Flume 1.5 中的何处放置自定义 jar?

java - 泽西容器请求过滤器 : Getting 404 after throwing 'abortWith' with status forbidden (403)

java - 如何将 nginx 连接到我的 java 模块

android - 如何创建中间带有 Logo 的二维码

android - 改造错误 : No Retrofit annotation found.(参数 #1)

java - 有什么方法可以让 Netbeans 在 Maven 项目中编译和保存类吗?

android - 如何关闭新的 Android 7.1 应用程序快捷方式

iOS AES 加密 - 加密失败