String de Java base64 codificar el algoritmo para que coincida con la aplicación OpenSSL
-
08-10-2019 - |
Pregunta
Como parte de intentar configurar SAML AuthN con Google Search Appliance, necesito para convertir mi respuesta en base 64. Para la prueba de concepto, acabo de utilizar el depurador en IntelliJ IDEA para reemplazar la cadena con una versión generada por el comando openssl:
openssl base64 -in inFileName -out outFileName
Ahora tengo que conseguir un trabajo versión sin mi intervención directa. Estoy usando los bienes comunes Apache base 64 codec biblioteca (v. 1.4), juego de caracteres UTF-8, longLinea 64, y el código es el siguiente:
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);
El resultado es bastante cerca de lo que necesito. Si hago un cifrado de OpenSSL en la cuerda justo antes de la biblioteca Apache hace de cosa (copiar signedSamlResponse antes de la línea 3 se ejecuta), y luego ejecutar un diff los dos resultados son casi idénticos. La única diferencia es el segundo personaje última en la última línea y esta diferencia ha sido consistente a través de todos mis intentos.
versión de OpenSSL:
dD48L0Fzc2VydGlvbj48L3NhbWxwOlJlc3BvbnNlPgo=
versión de Apache:
dD48L0Fzc2VydGlvbj48L3NhbWxwOlJlc3BvbnNlPg==
¿Qué necesito hacer para el conjunto de bytes o la cadena viene el fin de obtener los dos resultados que coinciden?
Solución
Parece que los extremos de la versión de OpenSSL con un "\ n" - por lo que después de haber eliminado a todos ellos en su segunda línea, se debe añadir una al final:)
(Básicamente, la matriz de bytes de OpenSSL tiene una 0x0a extra al final;. La versión de Apache que has dado no lo hace)