我正在使用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服務器端的能力非常有限。
請給點建議和啓發吧?
是差異鍵的奇偶校驗位_only_? – sarnold 2010-08-03 03:12:12
您可以舉例說明輸入和輸出嗎? – 2010-08-03 03:18:56