it-swarm.com.ru

base64url в Java

http://en.wikipedia.org/wiki/Base64#URL_applications

говорит о base64Url - Декодировать


существует модифицированный вариант 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;
}

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

24
ufk

Используя 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-адреса безопасным.

22
ufk

Java8 +

import Java.util.Base64;


return Base64.getUrlEncoder().encodeToString(bytes);
48
Boris Treukhov

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));
}
18
deamon

Гуава теперь имеет встроенное декодирование Base64. 

https://google.github.io/guava/releases/17.0/api/docs/com/google/common/io/BaseEncoding.html

6
jontro

В Android SDK есть специальный флаг в классе Base64: Base64.URL_SAFE, используйте его так, чтобы декодировать в строку:

import Android.util.Base64;
byte[] byteData = Base64.decode(body, Base64.URL_SAFE);
str = new String(byteData, "UTF-8");
5
Oded Breiner
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);
}
5
user249654

Сразу же, похоже, ваша replace() задом наперед; этот метод заменяет вхождения первого символа вторым, а не наоборот.

3
Pops

Ответ @ 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));
}

Документы

2
overthink

Этот класс может помочь:

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));
    }
}
0
Hadi Note