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

ovu*_*tin 4 java base64 encoding decoding

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

Array(116, 101, 115, 116, 32, 115, 116, 114, 105, 110, 106)
Run Code Online (Sandbox Code Playgroud)

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

// encoding...
Base64.getUrlEncoder().withoutPadding().encodeToString(myString.getBytes())
// decoding...
Base64.getUrlDecoder().decode(base64String)
Run Code Online (Sandbox Code Playgroud)

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

har*_*ldK 8

您看到的问题是由于"结果"(11个字节)中的字节数没有完全"填充"Base64编码字符串的最后一个字符.

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

dGVzdCBzdHJpbmo
dGVzdCBzdHJpbmp
dGVzdCBzdHJpbmq
dGVzdCBzdHJpbmr
Run Code Online (Sandbox Code Playgroud)

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

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