Base64url в java
http://en.wikipedia.org/wiki/Base64#URL_applications
рассказывает о base64Url - Decode
существует модифицированный вариант Base64 для URL, в котором не будет использовано дополнение '=', а символы "+" и "/" стандартного Base64 заменяются соответственно на "-" и "_"
Я создал следующую функцию:
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;
}
он возвращает очень малый набор символов, которые даже не похожи на ожидаемые результаты.
любые идеи?
Ответы
Ответ 1
С помощью Base64
от Apache Commons, который может быть настроен на безопасный URL, я создал следующую функцию:
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;
}
Конструктор Base64(true)
делает безопасным декодирование URL.
Ответ 2
Java8 +
import java.util.Base64;
return Base64.getUrlEncoder().encodeToString(bytes);
Ответ 3
Кодировка Base64 является частью JDK начиная с Java 8. Также поддерживается безопасное кодирование 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));
}
Ответ 4
В Guava теперь встроено декодирование Base64.
https://google.github.io/guava/releases/17.0/api/docs/com/google/common/io/BaseEncoding.html
Ответ 5
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);
}
Ответ 6
В Android SDK есть выделенный флаг в классе Base64
: Base64.URL_SAFE
, используйте его так, чтобы декодировать строку String:
import android.util.Base64;
byte[] byteData = Base64.decode(body, Base64.URL_SAFE);
str = new String(byteData, "UTF-8");
Ответ 7
С самого начала, похоже, что ваш replace()
обратный; этот метод заменяет появление первого символа вторым, а не наоборот.
Ответ 8
@ufk отвечает, но вам действительно не нужно устанавливать флаг urlSafe
, когда вы просто декодируете.
urlSafe применяется только для операций кодирования. Декодирование плавно обрабатывает оба режима.
Кроме того, есть некоторые статические помощники, чтобы сделать его более коротким и более явным:
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));
}
Документы
Ответ 9
Этот класс может помочь:
import android.util.Base64;
public class Encryptor {
public static String encode(String input) {
return Base64.encodeToString(input.getBytes(), Base64.URL_SAFE);
}
public static String decode(String encoded) {
return new String(Base64.decode(encoded.getBytes(), Base64.URL_SAFE));
}
}
Ответ 10
В Java попробуйте метод Base64.encodeBase64URLSafeString()
из библиотеки Commons Codec для кодирования.