tobase64string - base64url en java
java util base64 example (9)
Con el uso de Base64
de Apache Commons, que puede configurarse para una URL segura, creé la siguiente función:
import org.apache.commons.codec.binary.Base64;
public static String base64UrlDecode(String input) {
String result = null;
Base64 decoder = new Base64(true);
byte[] decodedBytes = decoder.decode(input);
result = new String(decodedBytes);
return result;
}
El constructor Base64(true)
hace que la decodificación sea segura.
http://en.wikipedia.org/wiki/Base64#URL_applications
habla de base64Url - Decode
existe una Base64 modificada para la variante de URL, donde no se usará el relleno ''='', y los caracteres ''+'' y ''/'' de Base64 estándar se reemplazan respectivamente por ''-'' y ''_''
He creado la siguiente función:
public static String base64UrlDecode(String input) {
String result = null;
BASE64Decoder decoder = new BASE64Decoder();
try {
result = decoder.decodeBuffer(input.replace(''-'',''+'').replace(''/'',''_'')).toString();
}
catch (IOException e) {
System.out.println(e.getMessage());
}
return result;
}
devuelve un conjunto muy pequeño de caracteres que ni siquiera se parecen a los resultados esperados. ¿algunas ideas?
Desde el principio, parece que su replace()
está al revés; ese método reemplaza las apariciones del primer carácter con el segundo, no al revés.
En Java, pruebe el método Base64.encodeBase64URLSafeString()
de la biblioteca Commons Codec para la codificación.
En el SDK de Android, hay un indicador dedicado en la clase Base64
: Base64.URL_SAFE
, utilícelo para decodificar a una cadena:
import android.util.Base64;
byte[] byteData = Base64.decode(body, Base64.URL_SAFE);
str = new String(byteData, "UTF-8");
Java8 +
import java.util.Base64;
return Base64.getUrlEncoder().encodeToString(bytes);
La guayaba ahora tiene la decodificación Base64 incorporada.
https://google.github.io/guava/releases/17.0/api/docs/com/google/common/io/BaseEncoding.html
La respuesta de @ufk funciona, pero en realidad no es necesario establecer el indicador urlSafe
cuando solo está decodificando.
urlSafe solo se aplica para codificar operaciones. La decodificación maneja a la perfección ambos modos.
Además, hay algunos ayudantes estáticos para hacerlo más corto y más explícito:
import org.apache.commons.codec.binary.Base64;
import org.apache.commons.codec.binary.StringUtils;
public static String base64UrlDecode(String input) {
StringUtils.newStringUtf8(Base64.decodeBase64(input));
}
Docs
http://en.wikipedia.org/wiki/Base64#URL_applications codificación http://en.wikipedia.org/wiki/Base64#URL_applications es parte del JDK desde Java 8. También se admite la codificación segura de URL.
import java.nio.charset.StandardCharsets;
import java.util.Base64;
public String encode(String raw) {
return Base64.getUrlEncoder()
.withoutPadding()
.encodeToString(raw.getBytes(StandardCharsets.UTF_8));
}
public static byte[] encodeUrlSafe(byte[] data) {
byte[] encode = Base64.encode(data);
for (int i = 0; i < encode.length; i++) {
if (encode[i] == ''+'') {
encode[i] = ''-'';
} else if (encode[i] == ''/'') {
encode[i] = ''_'';
}
}
return encode;
}
public static byte[] decodeUrlSafe(byte[] data) {
byte[] encode = Arrays.copyOf(data, data.length);
for (int i = 0; i < encode.length; i++) {
if (encode[i] == ''-'') {
encode[i] = ''+'';
} else if (encode[i] == ''_'') {
encode[i] = ''/'';
}
}
return Base64.decode(encode);
}