java中的base64url

java中的base64url,java,base64,base64url,Java,Base64,Base64url,谈论base64Url-解码 URL变量存在一个修改的Base64,其中不使用填充“=”,标准Base64的“+”和“/”字符分别替换为“-”和“\” 我创建了以下函数: public static String base64UrlDecode(String input) { String result = null; BASE64Decoder decoder = new BASE64Decoder(); try { result = decoder

谈论base64Url-解码


URL变量存在一个修改的Base64,其中不使用填充“=”,标准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;
}
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;
}
它返回一组非常小的字符,这些字符甚至与预期结果不相似。
有什么想法吗?

马上,你的
replace()
看起来是向后的;该方法将第一个字符替换为第二个字符,而不是相反。

通过使用Apache Commons中的
Base64
,可以将其配置为URL安全,我创建了以下函数:

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;
}
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安全。

公共静态字节[]编码URL安全(字节[]数据){
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);
}
字节[]encode=Base64.encode(数据); for(int i=0;i
番石榴现在内置Base64解码功能


@ufk的答案是有效的,但在解码时实际上不需要设置
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));
}
文件

编码是自Java8以来JDK的一部分。也支持,并且可以通过另外使用以下方法跳过“
=
”填充:


在Java中,尝试使用Commons编解码器库中的方法
Base64.encodeBase64URLSafeString()
进行编码。

在Android SDK中,在
Base64
类中有一个专用标志:
Base64.URL\u SAFE
,像这样使用它来解码为字符串:

import android.util.Base64;
byte[] byteData = Base64.decode(body, Base64.URL_SAFE);
str = new String(byteData, "UTF-8");
爪哇8+

本课程可以帮助:

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

我知道答案已经在那里了,但是如果有人想

import java.util.Base64; public 

class Base64BasicEncryptionExample {  

    publicstaticvoid main(String[] args) {  

       // Getting encoder  
       Base64.Encoder encoder = Base64.getUrlEncoder();  
       // Encoding URL  
       String eStr = encoder.encodeToString
                               ("http://www.javatpoint.com/javatutorial/".getBytes());  
       System.out.println("Encoded URL: "+eStr);  

       // Getting decoder  
       Base64.Decoder decoder = Base64.getUrlDecoder();  
       // Decoding URl  
       String dStr = new String(decoder.decode(eStr));  
       System.out.println("Decoded URL: "+dStr);  
    }  
}  

获得以下帮助:

您不应该使用
sun.misc.base64解码器
,因为它是内部sun/Oracle代码(不是J2SE的一部分),可能随时消失。中的类应该为您提供所需的所有功能。我的问题是如何在java中正确解码base64url字符串。谢谢,我试试阿帕奇commons@Benjamin哇,我没有意识到
BASE64Decoder
是Sun类,内部的还是其他的。我想知道他们为什么打破自己的命名惯例+1@BenjaminMuschko最好澄清一下,这是专门为那些没有意识到这是你评论中的一个链接的人准备的!:)它不应该是
replace(“',“/”)
警告:Trailing=字符被吞没!结果字符串仍然包含等号。这不是URL安全的,是吗?使用Base64.getUrlEncoder().withoutPadding().EncodeTString(str.getBytes(UTF_8))如果您不喜欢尾随“=”(填充),则使用:Base64.getUrlEncoder().withoutPadding().EncodeTString(str.g‌​etBytes(UTF_8))@kiedysktos您有一个示例序列吗?表
中的“URL和文件名安全”基本64字母表
不允许getUrlEncoder()使用它:好的,我使用的是
getEncoder()
,而不是
getUrlEncoder()
,我的好奇心是,如果你可以这么做,为什么要这么详细<代码>返回新字符串(newbase64(true).解码(输入))