2010-08-03 80 views
1

我正在使用hotp算法(RFC 4226)開發一次性密碼應用程序。我有一個Android應用程序(通過模擬器)用於生成otp,還有一個用於驗證的服務器端應用程序。就他們自己而言,兩者都正常工作並通過測試。Android和服務器之間的密鑰有所不同

但是,我在我的設備上生成的密鑰與我在服務器上生成的密鑰不同,即使輸入是硬編碼且它們之間相同。這導致在設備和服務器上生成不同的一次性密碼,這破壞了我生成有效的一次性密碼的能力。我試圖弄清楚爲什麼會發生這種情況,如果有什麼我可以做的。

服務器和設備模擬器之間的代碼是相同的,用於構造SecretKeys並從密鑰生成一次性密碼。我檢查了設備和服務器上keyspecs中的字節,它們是相同的。但是,當我從secretKey.getEncoded()中查看字節時,由SecretKeyFactories(都來自DESedeKeySpecs)生成的密鑰具有微妙的差異。我看到類似的差異,如果我使用DES而不是三重DES。

有趣的是,在我的Android項目中,KeySpec中的字節和生成的SecretKey是一致的(雖然截斷),但在服務器上,KeySpec和KeySpec之間的字節偶爾會出現一次性差異生成SecretKey。這是正常的嗎?在使用DES和三重DES時,我讀了一些關於奇偶校驗位的更改,所以我不確定這是否有問題。

我也知道Android使用Bouncy Castle,但我的服務器使用SunJCE。我的理解是,這不應該出現問題,並且我想知道在使用兩個不同的提供者時這是否是已知的發生。 Bouncy Castle服務器端的能力非常有限。

請給點建議和啓發吧?

+1

是差異鍵的奇偶校驗位_only_? – sarnold 2010-08-03 03:12:12

+1

您可以舉例說明輸入和輸出嗎? – 2010-08-03 03:18:56

回答

1

看起來像別人已經發現了問題和臨時解決方案。在生成密鑰時,電話上的BC實現和SunJCE如何處理奇偶校驗位是不同的。看起來像充氣城堡可能被釋放的更新來解決這個:

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

+0

你可以'接受'你自己的答案btw;) – Hamy 2010-08-03 18:37:36

+0

根據彈出窗口,直到明天。 – InverseFalcon 2010-08-03 19:48:24

相關問題