Подтвердить что ты не робот

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;
}

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

4b9b3361

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

Ответ 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 для кодирования.