Java String base64编码算法以匹配openssl实现

时间:2010-11-10 22:44:34

标签: java openssl base64 apache-commons-codec

尝试使用Google Search Appliance配置SAML AuthN时,我需要将响应转换为base64。为了概念验证,我只使用IntelliJ IDEA中的调试器将字符串替换为openssl命令生成的版本:

openssl base64 -in inFileName -out outFileName

现在我需要在没有直接干预的情况下使用一个版本。我正在使用Apache commons base64编解码器库(v.1.4),charset UTF-8,lineLength 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);

结果非常接近我的需要。如果我在apache库之前对字符串进行openssl加密(在第3行执行之前复制signedSamlResponse),然后运行diff两个结果它们几乎相同。唯一的区别是最后一行中的倒数第二个字符,这种差异在我的所有尝试中都是一致的。

Openssl版本:

dD48L0Fzc2VydGlvbj48L3NhbWxwOlJlc3BvbnNlPgo=

Apache版本:

dD48L0Fzc2VydGlvbj48L3NhbWxwOlJlc3BvbnNlPg==

我需要对字节数组或它来自的字符串做什么才能使两个结果匹配?

1 个答案:

答案 0 :(得分:3)

看起来openssl版本以“\ n”结尾 - 所以在第二行删除它们,你应该在最后添加一个:)

(基本上,openssl的字节数组末尾有一个额外的0x0a;你给出的Apache版本没有。)