如何在Java中将JSON转换为Base64字符串?

3

我有一个 JsonObject (使用Gson库),我想在将其发送到服务器之前使用Aes256对该json进行加密,因此我必须先将其转换为Base64格式。

JsonObject jsonObject = new JsonObject();
jsonObject.addProperty("command", "abc");


String body = Base64.encodeToString(jsonObject.toString().getBytes("UTF-8"), Base64.NO_WRAP);

String finalBody = aesKeyIv.encrypt(body);

然而,由于无法正确转换,它发送了格式不正确的json。
编辑:这是针对Android的。 我的加密方法:
 public String encrypt(String value) throws Exception {
        byte[] encrypted = cipherEnc.doFinal(value.getBytes());
        return Base64.encodeToString(encrypted, Base64.NO_WRAP);
    }

Aes能够加密任何字节数组(因此也包括所有UTF-8编码的字符串),而不仅仅是base64。当然,加密后的值看起来只是一串随机的字节,它永远不会是一个有效的JSON。你想要实现什么目标?你如何发送和接收加密数据?你如何交换密钥?最重要的是,你所说的“无法正确转换”是指什么?你是否遇到了错误? - undefined
base64值是正确的。因此问题不在所提供的代码中。我认为encrypt()方法有缺陷。 - undefined
@Robert,请查看我的编辑。我添加了加密方法。 - undefined
3个回答

2
您可以导入该库:
import org.apache.commons.codec.binary.Base64;

然后您可以使用以下代码将其编码为Base64:
public byte[] encodeBase64(String encodeMe){
byte[] encodedBytes = Base64.encodeBase64(encodeMe.getBytes());
return encodedBytes ;
} 

而解码时,您可以使用

public String decodeBase64(byte[] encodedBytes){
byte[] decodedBytes = Base64.decodeBase64(encodedBytes);
return new String(decodedBytes)
}

如果你正在使用 Java 8,那么你可以直接在包中使用Base64类:

import java.util.Base64; 

您的编码为Base64的代码将会更改为:

public String encodeBase64(byte [] encodeMe){
    byte[] encodedBytes = Base64.getEncoder().encode(encodeMe);
    return new String(encodedBytes) ;
    } 

同样地,您的新解码方式也会发生改变

public byte[]decodeBase64(String encodedData){
    byte[] decodedBytes = Base64.getDecoder().decode(encodedData.getBytes());
    return decodedBytes ;
    }

0

像加密值一样,byte[] 值应该进行 Base64 编码。

        String aesIv2EncryptedString = Base64.encodeToString(aesIv2Encrypted,
            Base64.NO_WRAP);
        jsonObject.addProperty("asIv", aesIv2EncryptedString);

这使得整个JSON都是可读的UTF-8文本,其中包含文本值,因为Base64提供了二进制数据的ASCII子集。

encrypt方法非常完美,只是String.getBytes()(在许多示例中看到)会使用平台编码;当这个软件在Windows上运行时,该编码将不是UTF-8,而是一些非Unicode(= 256个字符子集)编码。因此,字符将无法转换(“?”)并且变得混乱。因此,跨平台的解决方案是:

public String encrypt(String value) throws Exception {
    byte[] encrypted = cipherEnc.doFinal(value.getBytes("UTF-8"));
    return Base64.encodeToString(encrypted, Base64.NO_WRAP);
}

解密时:

byte[] originalValue = ...;
return new String(originalValue, "UTF-8");

那我应该逐个加密每个属性,然后将它们放入 JSON 对象中,再次加密它吗? - undefined
不,Base64不是一种加密方式,而是将二进制字节转换为ASCII文本的方法,使用A-z0-9/+作为64个数字来表示一个巨大的“数字”,每个数字存储6位。因此,只有那些byte[]值才能被正确转换。这些字节很可能不是正确的UTF-8编码。 - undefined
请你帮我检查一下我在编辑中的加密方法,是否正确? - undefined
是的,它本来可以工作,但我添加了一个小的更改,使得这段代码(尤其是数据部分)具有跨平台性。请注意解密过程。 - undefined

0

您可以使用Bouncy Castle和Apache Commons API将其转换为Base64,但请确保在编码和解码时使用相同的算法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接