3

hotpアルゴリズム(RFC 4226)を使用して、ワンタイムパスワードアプリケーションに取り組んでいます。otp生成用のAndroidアプリ(シミュレーター経由)と、検証用のサーバー側アプリがあります。どちらも正常に機能しており、テストに合格しています。

ただし、入力がハードコーディングされていて、入力が同じであっても、デバイスで生成している秘密鍵はサーバーで生成している秘密鍵と同じではありません。これにより、デバイスとサーバーで異なるワンタイムパスワードが生成され、有効なワンタイムパスワードを生成する機能が損なわれます。私はこれがなぜ起こっているのかを理解しようとしています、そしてそれについて私ができることがあれば。

シークレットキーを作成し、キーからワンタイムパスワードを生成するためのコードは、サーバーとデバイスシミュレーターの間で同一です。デバイスとサーバーのkeyspecsのバイトを確認しましたが、同じです。ただし、SecretKey.getEncoded()からバイトを表示すると、SecretKeyFactories(両方ともDESedeKeySpecsから)によって生成されたキーには、1つずつ微妙な違いがあります。トリプルDESの代わりにDESを使用すると、同様の違いが見られます。

興味深いのは、私のAndroidプロジェクトでは、KeySpecのバイトと生成されたSecretKeyは一貫していますが(切り捨てられていますが)、サーバーでは、KeySpecと生成されたSecretKeyのバイトに1つずつ違いがあることがあります。これは正常ですか?DESとトリプルDESを使用する際のパリティビットの変更について読んだので、これが問題かどうかはわかりません。

AndroidがBouncyCastleを使用していることも知っていますが、サーバーはSunJCEを使用しています。私の理解では、これは問題にはならないはずであり、2つの異なるプロバイダーを使用するときにこれが既知の発生であるかどうかを知りたいと思います。バウンシーキャッスルをサーバーサイドで取得する機能は非常に限られています。

アドバイスと悟りをお願いします?

4

1 に答える 1

2

他の誰かがすでに問題と暫定的な解決策を検出しているようです。これは、電話機の BC 実装と SunJCE が秘密鍵を生成するときにパリティ ビットを処理する方法の違いです。Bouncy Castle がこれに対処するためのアップデートをリリースする可能性があるようです:

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

于 2010-08-03T18:34:46.197 に答える