作爲嘗試使用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==
什麼我需要做的字節數組,或者來自於爲了得到兩個結果相匹配的字符串?
那麼,在字符串末尾添加\ n確實會將Apache字符串的最後4個字符更改爲「Pgo =」但它也將openssl版本的特性改爲「PgoK」。儘管事實上新版本的Apache與老版本的openssl相匹配,但GSA仍然只能成功解碼openssl。 我擔心,當我複製並粘貼到gedit以進行轉換時,會有東西被添加,但我不知道這可能是什麼。 – 2010-11-11 15:18:58
@Shawn:我只是建議在調用Apache代碼時添加'\ n'。 – 2010-11-11 15:47:59