我正在爲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,那麼問題不是操作系統,我認爲)。
已嘗試所有變體:CRLF,NO_CLOSE,NO_PADDING,NO_WRAP, URL_SAFE ...什麼也沒有... 有問題的另一個字符串是n2EaLpQr0uKgkZKhCQzwuIFeeLjzZKerZcETVN cfla4 = <--> n2EaLpQr0uKgkZKhCQzwuD9eeLjzZKerZcETVNcfla4 = 那麼問題是不是+或precence - ... 但是感謝絃樂 – Massimo
的Base64面前人人平等? – Alex
是的......我查過了。 我認爲如果這些不等於,生成的字符串將會完全不同(因爲SHA256算法)。 – Massimo