为什么Base64.decode为不同的字符串生成相同的字节数组?

时间:2015-04-29 10:38:51

标签: java encoding base64 decoding

我使用URL安全的Base64编码来编码我随机生成的字节数组。但我解码时遇到问题。当我解码两个不同的字符串(除了最后一个字符都相同)之外,它产生相同的字节数组。例如,对于"dGVzdCBzdHJpbmr""dGVzdCBzdHJpbmq"字符串,结果都是相同的:

Array(116, 101, 115, 116, 32, 115, 116, 114, 105, 110, 106)

对于编码/解码,我以这种方式使用java.util.Base64

// encoding...
Base64.getUrlEncoder().withoutPadding().encodeToString(myString.getBytes())
// decoding...
Base64.getUrlDecoder().decode(base64String)

这次碰撞的原因是什么?除了最后一个之外,是否还可以使用字符?我如何解决这个问题并使解码为每个不同的字符串返回一个不同的字节数组?

3 个答案:

答案 0 :(得分:8)

您看到的问题是由于“结果”(11个字节)中的字节数未完全“填充”Base64编码字符串的最后一个字符。

请记住,Base64将每个8位实体编码为6位字符。结果字符串则需要11 * 8/6字节或14 2/3字符。但你不能写部分字符。只有前4位(或最后一个字符的2/3)才有意义。最后两位未解码。所以:

dGVzdCBzdHJpbmo
dGVzdCBzdHJpbmp
dGVzdCBzdHJpbmq
dGVzdCBzdHJpbmr

全部解码为相同的11个字节(116, 101, 115, 116, 32, 115, 116, 114, 105, 110, 106)。

PS:没有填充,一些解码器也会尝试解码“最后”字节,你将得到一个12字节的结果(不同的最后一个字节)。这就是我评论的原因(询问withoutPadding()选项是否是一个好主意)。但你的解码器似乎处理这个。

答案 1 :(得分:0)

这可能是Base64编码和解码的方式......看看这个this是否有帮助。 阅读以下描述以了解Base 64的实际工作情况。如果数组字符串末尾有差异,则编码值将可能反映在同一位置。

答案 2 :(得分:0)

您展示的数组是"测试strinj"的ASCII表示。 (参见http://www.unit-conversion.info/texttools/ascii/)并且似乎不是任何事物的base64表示。

好像你正在分析错误的结果'阵列