2010-11-10 89 views
0

作爲嘗試使用Google Search Appliance配置SAML AuthN的一部分,我需要將我的響應轉換爲base64。對於概念驗證,我只是用在IntelliJ IDEA的調試與OpenSSL的命令生成的版本替換字符串:Java String base64 encode algorithm to match openssl implementation

openssl base64 -in inFileName -out outFileName 

現在我需要得到一個版本,而我的直接干預工作。我使用的是Apache commons base64編解碼器庫(1.4版),字符集UTF-8,線路長度64,代碼如下:

Base64 encoder = new Base64(64); 
signedSamlResponse = signedSamlResponse.replaceAll("[\n\r]",""); 
byte[] bytes = encoder.encode(signedSamlResponse.getBytes("UTF-8")); 
signedSamlResponse = new String(bytes,0,bytes.length); 

結果非常接近我所需要的。如果我在字符串之前對字符串執行openssl加密,那麼它就是事物(在第3行執行前複製signedSamlResponse),然後運行diff,兩個結果幾乎完全相同。唯一的區別是最後一行中的倒數第二個字符,這個差異在所有的嘗試中都是一致的。

Openssl的版本:

dD48L0Fzc2VydGlvbj48L3NhbWxwOlJlc3BvbnNlPgo= 

Apache的版本:

dD48L0Fzc2VydGlvbj48L3NhbWxwOlJlc3BvbnNlPg== 

什麼我需要做的字節數組,或者來自於爲了得到兩個結果相匹配的字符串?

回答

3

它看起來像OpenSSL的版本用「\ n」結尾的 - 所以在去除他們都在你的第二行,你應該在年底:)

(基本上,從OpenSSL的字節數組添加一個在最後一個額外的0x0a;你給出的Apache版本沒有)

+0

那麼,在字符串末尾添加\ n確實會將Apache字符串的最後4個字符更改爲「Pgo =」但它也將openssl版本的特性改爲「PgoK」。儘管事實上新版本的Apache與老版本的openssl相匹配,但GSA仍然只能成功解碼openssl。 我擔心,當我複製並粘貼到gedit以進行轉換時,會有東西被添加,但我不知道這可能是什麼。 – 2010-11-11 15:18:58

+0

@Shawn:我只是建議在調用Apache代碼時添加'\ n'。 – 2010-11-11 15:47:59