2012-10-09 140 views
1

我正在爲Android編程一個認證服務,這個包括一個用java編寫的服務器部分。 我做兩個部分Android中執行這兩個碼片相同的操作和服務器:使用「android.util.Base64」和「org.apache.commons.codec.binary.Base64;」的不同編碼

ANDROID:

String genChallengeResponse(String challenge, String message) { 
    String Hmac_ALG = "HmacSHA256"; 
    SecretKey key = new SecretKeySpec(challenge.getBytes(), Hmac_ALG); 
    Mac m = Mac.getInstance(Hmac_ALG); 
    m.init(key); 
    m.update(password.getBytes()); 
    byte[] mac = m.doFinal(); 
    return new String(Base64.encode(mac, Base64.DEFAULT)); 
} 

SERVER:

String genChallengeResponse(String challenge, String message) { 
    String Hmac_ALG = "HmacSHA256"; 
    SecretKey key = new SecretKeySpec(challenge.getBytes(), Hmac_ALG); 
    Mac m = Mac.getInstance(Hmac_ALG); 
    m.init(key); 
    m.update(password.getBytes()); 
    byte[] mac = m.doFinal(); 
    return new String(Base64.encodeBase64(mac)); 
} 

從同樣的挑戰和消息這些啓動是結果:

 
Android: n2EaLpQr0uKgkZKhCQzwuIFeeLjzZKerZcETVNcfla4= 
Server: n2EaLpQr0uKgkZKhCQzwuD9eeLjzZKerZcETVNcfla4= 
           ^^ 

這些是不同的nt只是爲了兩個字符。 的問題是,這種奇怪的行爲不會出現在每對字符串傳遞給函數...

我試圖用在每個系統中的UTF-8,但沒有任何變化...... 難道有人知道什麼問題是什麼?如果這是一個已知的問題... ...

(重要的是說問題是相同的使用Android 2.2或4.0,那麼問題不是操作系統,我認爲)。

回答

2

還不能因此評論,因爲答案:

我在幾個星期前發現,Android的Base64編碼的換行符使用不同的設置(點擊此處查看:http://developer.android.com/reference/android/util/Base64.html

我想在我的情況下,它是NO_WRAP missing.Perhaps其他選項之一(NO_PADDING或URL安全,測試密碼是否包含+或 - ?)可能會更改您的結果...

+0

已嘗試所有變體:CRLF,NO_CLOSE,NO_PADDING,NO_WRAP, URL_SAFE ...什麼也沒有... 有問題的另一個字符串是n2EaLpQr0uKgkZKhCQzwuIFeeLjzZKerZcETVN cfla4 = <--> n2EaLpQr0uKgkZKhCQzwuD9eeLjzZKerZcETVNcfla4 = 那麼問題是不是+或precence - ... 但是感謝絃樂 – Massimo

+0

的Base64面前人人平等? – Alex

+0

是的......我查過了。 我認爲如果這些不等於,生成的字符串將會完全不同(因爲SHA256算法)。 – Massimo

相關問題