Java String base64 encode algorithm to match openssl implementation

问题描述:

作为尝试使用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== 

什么我需要做的字节数组,或者来自于为了得到两个结果相匹配的字符串?

它看起来像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