Алгоритм кодирования Java String base64 для соответствия реализации openssl - PullRequest
0 голосов
/ 11 ноября 2010

В рамках попытки настроить SAML AuthN с Google Search Appliance мне нужно преобразовать мой ответ в base64.Для подтверждения концепции я просто использовал отладчик в IntelliJ IDEA, чтобы заменить строку версией, сгенерированной командой openssl:

openssl base64 -in inFileName -out outFileName

Теперь мне нужно, чтобы версия работала без моего непосредственного вмешательства.Я использую библиотеку кодеков Apache commons base64 (v. 1.4), кодировку 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);

Результат довольноблизко к тому, что мне нужно.Если я выполняю шифрование openssl в строке непосредственно перед тем, как библиотека apache сделает это (скопируйте signSamlResponse до выполнения строки 3), а затем запустите diff, два результата будут почти идентичны.Единственное отличие - второй последний символ в последней строке, и это различие было постоянным во всех моих попытках.

Версия Openssl:

dD48L0Fzc2VydGlvbj48L3NhbWxwOlJlc3BvbnNlPgo=

Версия Apache:

dD48L0Fzc2VydGlvbj48L3NhbWxwOlJlc3BvbnNlPg==

Что мне нужно сделать с байтовым массивом или строкой, из которой он получен, чтобы сопоставить два результата?

1 Ответ

3 голосов
/ 11 ноября 2010

Похоже, версия openssl оканчивается на "\ n" - поэтому, удалив их все во второй строке, вы должны добавить один в конце:)

(По сути, байтовый массив из opensslимеет дополнительный 0x0a в конце, а указанная вами версия Apache - нет.

...