Java:使用 java.util.Base64 与 android.util.Base64 解码 base64 字符串时的不同结果

     2023-05-07     127

关键词:

【中文标题】Java:使用 java.util.Base64 与 android.util.Base64 解码 base64 字符串时的不同结果【英文标题】:Java: Different results when decoding base64 string with java.util.Base64 vs android.util.Base64 【发布时间】:2015-10-04 16:35:30 【问题描述】:

我正在开发客户端/服务器系统,并且正在尝试进行一些基本的加密。当我连接到服务器时,我通过套接字发送一个公钥作为转义字符串。我已经验证了字符串在两端、换行符和所有方面都是 相同 的。

在客户端 (Android) 上,我可以使用公钥/私钥成功加密和解密密钥(用于测试目的)。但是,当尝试将公钥从 String 解码为 byte[] 时,服务器直接失败了:

 java.lang.IllegalArgumentException: Illegal base64 character a

这似乎很荒谬,因为“a”绝对是一个 base64 字符,如果我理解正确的话。客户端和服务器使用共享库来处理所有加密,因此代码几乎相同。 唯一的区别在于编码/解码 base64 字符串,因为 java.util.Base64 在 Android 上不可用。

共享课程

public abstract class EasyCrypt 

...

    public PublicKey loadPublicKey(String key64) throws GeneralSecurityException 

        byte[] data = decode(key64); //Calls abstract methods, shown below

        X509EncodedKeySpec spec = new X509EncodedKeySpec(data);
        KeyFactory fact = KeyFactory.getInstance("RSA");
        return fact.generatePublic(spec);
    

...


客户端 (Android) 方法

import android.util.Base64;

public class ClientCrypt extends EasyCrypt 
    @Override
    protected byte[] decode(String s) 
        return Base64.decode(s.getBytes(), Base64.DEFAULT); //Works perfectly
    

    @Override
    protected String encode(byte[] bytes) 
        return Base64.encodeToString(bytes, Base64.DEFAULT);
    

服务器 (Linux) 方法

import java.util.Base64;

public class ServerCrypt extends EasyCrypt
    @Override
    public byte[] decode(String str)
        return Base64.getDecoder().decode(str); //Throws IllegalArgumentException
    

    @Override
    public String encode(byte[] bytes)
        return Base64.getEncoder().encodeToString(bytes);
    

【问题讨论】:

尝试在android中使用Base64.NO_WRAP而不是DEFAULT Android 是正常工作的。 你在android上编码吧?如果是,那么在您的 android 上的编码方法中尝试 Base64.NO_WRAP 你能显示你尝试解码的 base64str 吗? 我相信你有格式问题,它以某种方式包装或标签 【参考方案1】:

在安卓上,使用Base64.NO_WRAP 而不是Base64.DEFAULT

@Override
protected String encode(byte[] bytes) 
    return Base64.encodeToString(bytes, Base64.NO_WRAP);

【讨论】:

@Mohammad Adil 我从服务器获得了一个由 java.util.Base64 类编码的字符串,我正在用 android.util.base64 解码该字符串,但没有给出预期的结果。请帮助我 感谢 Base64.NO_WRAP 它在我的 Java 后端工作(使用 java.util.Base64)。 想在java中做。我没有安卓。通过使用 java.util.Base64 结果不同【参考方案2】:

Base64.getMimeDecoder()代替Base64.getDecoder()

【讨论】:

java.util.Base64.getMimeDecoder() 调用需要 API 级别 26。 检查this link以获得进一步的解释。

java新版本base64encoder和base64decoder无法使用解决方案

原因:  /lib/tool.jar和/lib/rt.jar已经从JavaSE9中删除,要使用java.util.Base64包中的方法importjava.util.Base64;importjava.util.Base64.Decoder;importjava.util.Base64.Encoder;Encoderencoder=Base64.getEncoder();Stringsig=en 查看详情

为什么java.util.base64和org.apache.commons.ssl.base64彼此不兼容?

尝试将SAML解码从使用apachecommons升级到使用内置Java8类。使用Java时失败。有没有办法让Java像apache一样工作?任何人都可以解释为什么这些不同?答案区别在于每个用于解码的RFC规范:RFC4648与RFC2045。要将2045与Java一起使用,请调... 查看详情

java.util.base64解码然后编码产生不同的字符串

问题:解码Fz+=然后将其编码回来产生Fz8=以下代码:newString(Base64.getEncoder().encode(Base64.getDecoder().decode("Fz+=".getBytes("UTF-8"))))给出以下字符串:Fz8=+怎么变成8?我必须在这里遗漏一些东西。Fz+=位模式:000101110011111110000000重新排列为8... 查看详情

2019-07-24jdk8后使用base64替换base64decoder

参考技术Ajdk8之后,sun.misc.BASE64Decoder和sun.misc.BASE64Encoder被移除从JDK1.8开始,就提供了java.util.Base64.Decoder和java.util.Base64.Encoder的JDK公共API,可代替sun.misc.BASE64Decoder和sun.misc.BASE64Encoder的JDK内部API 查看详情

从文件中读取数据并编码成base64java

从文件中读取数据并编码成base64java从文件中读取数据并编码成base64java参考技术A代码如下:import java.io.FileInputStream;import java.io.IOException;import java.util.Arrays;import java.util.Base64;import java.util.Base64.Encoder;public class... 查看详情

java怎么把普通字符串转换为base64字符串

...base64Encode(String token)  byte[] encodedBytes = java.util.Base64.getEncoder().encode(token.getBytes()); return new String(en 查看详情

Apache Commons Codec Base64 是 sun.misc.BASE64 的替代品吗?

...题描述】:背景这是我最初的问题Migratingfromsun.misc.BASE64toJava8java.util.Base64的后续问题,因为s 查看详情

为什么在intellij中baseencoding被标记为不稳定?(代码片段)

...,因此它可能完全正常运行。但是,如果你在哪里我仍然使用java.util.Base64,因为我从未遇到任何问题。这应该提供相同的结果:java.util.Base64.getEncoder().encode(byteArrayEntity.getBytes()); 查看详情

android7.1.1系统,toast的exception:android.view.windowmanager$badtokenexception解决(代码片段)

...如有个接口字段用了base64,但是我添加包的时候用的java.util.base64结果会崩溃报错,网上搜索后要用android.util.base64来解决,  今天发现突然有崩溃,看了下崩溃信息FatalException:android.view.WindowManager$BadTokenException:Unab... 查看详情

android7.1.1系统,toast的exception:android.view.windowmanager$badtokenexception解决(代码片段)

...如有个接口字段用了base64,但是我添加包的时候用的java.util.base64结果会崩溃报错,网上搜索后要用android.util.base64来解决, 今天发现突然有崩溃,看了下崩溃信息 FatalException:android.view.WindowManager$BadTokenException:Unab... 查看详情

android7.1.1系统,toast的exception:android.view.windowmanager$badtokenexception解决(代码片段)

...如有个接口字段用了base64,但是我添加包的时候用的java.util.base64结果会崩溃报错,网上搜索后要用android.util.base64来解决,  今天发现突然有崩溃,看了下崩溃信息FatalException:android.view.WindowMana 查看详情

android7.1.1系统,toast的exception:android.view.windowmanager$badtokenexception解决(代码片段)

...如有个接口字段用了base64,但是我添加包的时候用的java.util.base64结果会崩溃报错,网上搜索后要用android.util.base64来解决,  今天发现突然有崩溃,看了下崩溃信息FatalException:android.view.WindowMana 查看详情

启动 Java 时使用 -d32 和 -d64

】启动Java时使用-d32和-d64【英文标题】:Usageof-d32and-d64whilelaunchingJava【发布时间】:2015-09-1317:45:03【问题描述】:我阅读了以下来自JDKFAQ\'s的摘录如何在32位和64位操作之间进行选择?默认是什么?选项-d32和-d64已添加到Java启动... 查看详情

使用 MinGW C++ 编译 64 位静态库以在 Java (JNI) 中使用

】使用MinGWC++编译64位静态库以在Java(JNI)中使用【英文标题】:Compilinga64bitstaticlibwithMinGWC++forusageinJava(JNI)【发布时间】:2014-03-0914:09:32【问题描述】:这个问题与JNI%1isnotavalidWin32application类似的问题。我还想从C++源代码编译一个64... 查看详情

如何使用 64 位浏览器和 64 位 java 插件在 64 位 Linux 上获取 32 位 JRE 路径

】如何使用64位浏览器和64位java插件在64位Linux上获取32位JRE路径【英文标题】:Howtoget32bitJREpathon64bitLinuxwith64bitbrowserand64bitjavaplugin【发布时间】:2012-05-1919:29:30【问题描述】:我的应用程序由三个组件组成:小程序Java程序(myapp.ja... 查看详情

在 Java 中解码 Base64 数据

...ase64编码的图像。在Java中解码的最佳方法是什么?希望只使用SunJava6附带的库。【问题讨论】:无论您使用什么类型的应用程序(实验与否),它就像使用这里的代码在您的utils包中创建一个Base64.java文件一样简单:migbase64.sourcefo... 查看详情

如何使用 Java 将 base 64 图像插入 BLOB 列? (甲骨文)

】如何使用Java将base64图像插入BLOB列?(甲骨文)【英文标题】:Howtoinsertabase64imageintoaBLOBcolumnwithJava?(Oracle)【发布时间】:2021-11-1213:31:38【问题描述】:我正在从事一个从API获取base64图像的项目,我想将它作为图像(BLOB)存储在Ora... 查看详情

java使用数组实现顺序队列

packagecom.Alg;importjava.io.Serializable;importjava.util.Arrays;/***@ClassNameSequentialQueue*@authorsunyu*@Description顺序队列*@param<T>*/publicclassSequentialQueue<T>impleme 查看详情